Return the multiply of a column
One dplyr
, tidyr
and purrr
solution could be:
map(.x = names(df)[-1],
~ df %>%
uncount(get(.x)) %>%
select(!!.x := index) %>%
rowid_to_column()) %>%
reduce(full_join)
rowid t1 t2 t3 t4
1 1 10 10 10 10
2 2 20 10 20 40
3 3 20 10 30 40
4 4 30 10 NA NA
5 5 30 20 NA NA
6 6 30 20 NA NA
7 7 NA 20 NA NA
8 8 NA 20 NA NA
9 9 NA 20 NA NA
10 10 NA 30 NA NA
11 11 NA 30 NA NA
12 12 NA 30 NA NA
13 13 NA 30 NA NA
14 14 NA 30 NA NA
15 15 NA 30 NA NA
Base R and one line of code.
Map(function(x) rep(df$index, x), df[,-1])
After update:
maxy <- max(apply(df[,-1], 2, sum))
data.frame(Map(function(x) c(rep(df$index, x), rep(NA, maxy - sum(x))), df[,-1]))
Using base R
with lapply
lst1 <- lapply(df[-1], function(x) rep(df$index, x))
data.frame(lapply(lst1, `length<-`, max(lengths(lst1))))
-output
# t1 t2 t3 t4
#1 10 10 10 10
#2 20 10 20 40
#3 20 10 30 40
#4 30 10 NA NA
#5 30 20 NA NA
#6 30 20 NA NA
#7 NA 20 NA NA
#8 NA 20 NA NA
#9 NA 20 NA NA
#10 NA 30 NA NA
#11 NA 30 NA NA
#12 NA 30 NA NA
#13 NA 30 NA NA
#14 NA 30 NA NA
#15 NA 30 NA NA