Home > OS >  Add new columns to data frame for each unique value in another column
Add new columns to data frame for each unique value in another column

Time:01-12

I'd like to add a new column for each unique value in another column. Then for each of these columns the value will either be the value from the other column, or zero.

For the example below i would like to add 4 new columns (A:D), for column B would be (0,0,0,0,5,6,7,8,0,0,0,0,0,0,0,0) etc.

df <- data.frame(Group=rep(c('A', 'B', 'C', 'D'), each=4),
                 score=1:16)        
df

CodePudding user response:

Using map_dfc:

library(purrr)
library(dplyr)
map_dfc(setNames(unique(df$Group), unique(df$Group)), 
        ~ ifelse(df$Group == .x, df$score, 0)) %>% 
  bind_cols(df, .)

   Group score A B  C  D
1      A     1 1 0  0  0
2      A     2 2 0  0  0
3      A     3 3 0  0  0
4      A     4 4 0  0  0
5      B     5 0 5  0  0
6      B     6 0 6  0  0
7      B     7 0 7  0  0
8      B     8 0 8  0  0
9      C     9 0 0  9  0
10     C    10 0 0 10  0
11     C    11 0 0 11  0
12     C    12 0 0 12  0
13     D    13 0 0  0 13
14     D    14 0 0  0 14
15     D    15 0 0  0 15
16     D    16 0 0  0 16

Or in base R:

cbind(df, 
      sapply(unique(df$Group), \(x) ifelse(df$Group == x, df$score, 0)))
  • Related