2 views

df <- data.frame(var1=c('a', 'b', 'c'), var2=c('d', 'e', 'f'), freq=1:3)

What is the simplest way to expand the first two columns of the data.frame above, so that each row appears the number of times specified in the column 'freq'?

In other words, go from this:

df

var1 var2 freq

1    a    d    1

2    b    e    2

3    c    f    3

To this:

df.expanded

var1 var2

1    a    d

2    b    e

3    b    e

4    c    f

5    c    f

6    c    f

To replicate each row of a data frame and specify the number of replications for each row, you can use the uncount function from the tidyverse package as follows:

df <- data.frame(var1=c('a', 'b', 'c'), var2=c('d', 'e', 'f'), freq=1:3)

library(tidyr)

df %>%

uncount(freq)

Output:

var1 var2

1      a    d

2      b    e

2.1    b    e

3      c    f

3.1    c    f

3.2    c    f

You can also use the following to replicate rows:

df[rep(row.names(df), df\$freq), 1:2]

Output:

var1 var2

1      a    d

2      b    e

2.1    b    e

3      c    f

3.1    c    f

3.2    c    f