Reputation: 411
I have an example df:
df <- data.frame(
col1 = c(1,2,3),
col2 = c('A','F','Z'),
col3 = c('R', 'E', 'P')
)
col1 col2 col3
1 1 A R
2 2 F E
3 3 Z P
and I want to create this:
df2 <- data.frame(
col1 = c(1,1,2, 2, 3, 3),
col2 = c('A', 'A', 'F', 'F', 'Z', 'Z'),
col3 = c('R','R', 'E','E', 'P','P'),
col4 = c('Total', "Average", 'Total', "Average", 'Total', "Average"),
col5 = c('ZZ', 'BB', 'ZZ', 'BB','ZZ', 'BB')
)
col1 col2 col3 col4 col5
1 1 A R Total ZZ
2 1 A R Average BB
3 2 F E Total ZZ
4 2 F E Average BB
5 3 Z P Total ZZ
6 3 Z P Average BB
where I add:
col4 = c('Total', 'Average')
col5 = c('ZZ', 'BB')
to each existing row. I could add the columns in two duplicated dataframes and do a rbind after but is there a more efficient way of doing this?
Upvotes: 1
Views: 212
Reputation: 887961
Using base R
merge(df, data.frame(col4, col5))
-output
col1 col2 col3 col4 col5
1 1 A R Total ZZ
2 2 F E Total ZZ
3 3 Z P Total ZZ
4 1 A R Average BB
5 2 F E Average BB
6 3 Z P Average BB
Upvotes: 1
Reputation: 52399
You can use crossing
:
tidyr::crossing(df, data.frame(col4, col5))
col1 col2 col3 col4 col5
1 1 A R Total ZZ
2 1 A R Average BB
3 2 F E Total ZZ
4 2 F E Average BB
5 3 Z P Total ZZ
6 3 Z P Average BB
Upvotes: 0