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

Tags:

R

Dataframe