A solution based on tidyr::unite and tidyr::separate:
library(tidyverse)
df <- data.frame(
stringsAsFactors = FALSE,
ID = c(1L, 2L, 3L, 4L),
pick1 = c(NA, "21/11/28", "21/11/28", NA),
pick2 = c("21/11/29", "21/11/29", NA, "21/11/29"),
pick3 = c("21/11/30", NA, "21/11/30", "21/11/30")
)
df %>%
unite(date, sep=",", na.rm=T) %>%
separate(date, into = c("ID", str_c("date", 1:2)), sep = ",", convert = T)
#> ID date1 date2
#> 1 1 21/11/29 21/11/30
#> 2 2 21/11/28 21/11/29
#> 3 3 21/11/28 21/11/30
#> 4 4 21/11/29 21/11/30
Yet another solution:
library(tidyverse)
df %>%
pivot_longer(cols = str_c("pick",1:3), values_drop_na = T) %>%
mutate(name = rep(c("date1","date2"), n()/2)) %>%
pivot_wider(ID)
#> # A tibble: 4 × 3
#> ID date1 date2
#> <int> <chr> <chr>
#> 1 1 21/11/29 21/11/30
#> 2 2 21/11/28 21/11/29
#> 3 3 21/11/28 21/11/30
#> 4 4 21/11/29 21/11/30
And with tidyr::unnest_wider:
library(tidyverse)
df %>%
pivot_longer(cols = str_c("pick",1:3),values_drop_na = T) %>%
mutate(name = "date") %>%
pivot_wider(ID, values_fn = list) %>%
unnest_wider(col="date", names_sep = "")
#> # A tibble: 4 × 3
#> ID date1 date2
#> <int> <chr> <chr>
#> 1 1 21/11/29 21/11/30
#> 2 2 21/11/28 21/11/29
#> 3 3 21/11/28 21/11/30
#> 4 4 21/11/29 21/11/30