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