karuno
karuno

Reputation: 411

add new column with multiple values for each existing row

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

Answers (2)

akrun
akrun

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

Ma&#235;l
Ma&#235;l

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

Related Questions