Home > Enterprise >  How can do extend row length by adding varying number of NAs in r?
How can do extend row length by adding varying number of NAs in r?

Time:09-20

My data has an ID col, years cols (1:6). The second col 'Shift' contains values which indicate the the number of NAs to be inserted into every row before col 'yr1'. I am looking for a code which can do the task. My data;

structure(list(ID = c("A", "B", "C", "D", "F", "G", "H", "I", 
"J", "K"), Shift = c("0", "1", "2", "7", "3", "10", "4", "2", 
"5", "11"), yr1 = c("38", "37", "47", "53", "39", "39", "37", 
"43", "49", "45"), yr2 = c("38", "0", "47", "0", "0", "0", "0", 
"0", "0", NA), yr3 = c("0", "0", "0", "52", "0", NA, "0", "44", 
"0", NA), yr2.1 = c("39", "0", "46", "51", "0", NA, "0", "0", 
"51", NA), yr5 = c(NA, "0", "46", "0", "0", NA, "0", "45", "53", 
NA), yr6 = c("41", "0", "0", NA, "0", NA, "0", "47", "0", NA)), class = "data.frame", row.names = c(NA, 
-10L))

My intended output,

structure(list(ID = c("A", "B", "C", "D", "F", "G", "H", "I", 
"J", "K"), Shift = c("0", "1", "2", "7", "3", "10", "4", "2", 
"5", "6"), yr1 = c("38", NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    yr2 = c("38", "37", NA, NA, NA, NA, NA, NA, NA, NA), yr3 = c("0", 
    "0", "47", NA, NA, NA, NA, "43", NA, NA), yr2.1 = c("39", 
    "0", "47", NA, "39", NA, NA, "0", NA, NA), yr5 = c(NA, "0", 
    "0", NA, "0", NA, "37", "44", NA, NA), yr6 = c("41", "0", 
    "46", NA, "0", NA, "0", "0", "49", NA), X = c(NA, 0L, 46L, 
    NA, 0L, NA, 0L, 45L, 0L, 45L), X.1 = c(NA, NA, 0L, 53L, 0L, 
    NA, 0L, 47L, 0L, NA), X.2 = c(NA, NA, NA, 0L, 0L, NA, 0L, 
    NA, 51L, NA), X.3 = c(NA, NA, NA, 52L, NA, NA, 0L, NA, 53L, 
    NA), X.4 = c(NA, NA, NA, 51L, NA, 39L, NA, NA, 0L, NA), X.5 = c(NA, 
    NA, NA, 0L, NA, 0L, NA, NA, NA, NA), X.6 = c(NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA), X.7 = c(NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA), X.8 = c(NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA), X.9 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA)), class = "data.frame", row.names = c(NA, -10L))

CodePudding user response:

I'm assuming year2.1 was meant to be year4, since it seems to be treated that way:

library(tidyverse)
df %>%
  pivot_longer(-(ID:Shift)) %>%    # reshape longer
  mutate(year = if_else(name == "yr2.1", 4, parse_number(name))) %>%   # fix yr2.1
  mutate(year = year   parse_number(Shift)) %>%        # change year by Shift
  select(-name) %>%
  pivot_wider(names_from = year, names_prefix = "yr")  # reshape wide

Result

# A tibble: 10 × 19
   ID    Shift yr1   yr2   yr3   yr4   yr5   yr6   yr7   yr8   yr9   yr10  yr11  yr12  yr13  yr14  yr15  yr16  yr17 
   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 A     0     38    38    0     39    NA    41    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA   
 2 B     1     NA    37    0     0     0     0     0     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA   
 3 C     2     NA    NA    47    47    0     46    46    0     NA    NA    NA    NA    NA    NA    NA    NA    NA   
 4 D     7     NA    NA    NA    NA    NA    NA    NA    53    0     52    51    0     NA    NA    NA    NA    NA   
 5 F     3     NA    NA    NA    39    0     0     0     0     0     NA    NA    NA    NA    NA    NA    NA    NA   
 6 G     10    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    39    0     NA    NA    NA    NA    NA   
 7 H     4     NA    NA    NA    NA    37    0     0     0     0     0     NA    NA    NA    NA    NA    NA    NA   
 8 I     2     NA    NA    43    0     44    0     45    47    NA    NA    NA    NA    NA    NA    NA    NA    NA   
 9 J     5     NA    NA    NA    NA    NA    49    0     0     51    53    0     NA    NA    NA    NA    NA    NA   
10 K     11    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    45    NA    NA    NA    NA    NA
  • Related