数据帧:从列到新列名称的唯一值

时间:2016-10-10 09:08:19

标签: r dataframe

我有以下示例数据框:

data.frame(ID=c(1:9),COLOR=c('red','green','blue','white','black','yellow','red','blue','red'),
           SHAPE=c('square','circle','triangle','square','triangle','circle','circle','circle','square'), 
           VAR_X=c(5,8,3,9,7,4,2,9,12))


  ID  COLOR    SHAPE VAR_X
1  1    red   square     5
2  2  green   circle     8
3  3   blue triangle     3
4  4  white   square     9
5  5  black triangle     7
6  6 yellow   circle     4
7  7    red   circle     2
8  8   blue   circle     9
9  9    red   square    12

使用此数据框,我想从COLOR和SHAPE的组合为每个唯一值创建一个新列。因此,在我的示例中,我想要新的列:'红色方块'绿色圆圈'蓝色三角形'白色方块' ;,'黑色三角形'黄色圆圈'红色圆圈'蓝色圆圈'。新列中每个观察值应与COLOR和SHAPE组合相对应。对于红场'这看起来像是:

  ID  COLOR    SHAPE VAR_X red_square
1  1    red   square     5       true
2  2  green   circle     8      false
3  3   blue triangle     3      false
4  4  white   square     9      false
5  5  black triangle     7      false
6  6 yellow   circle     4      false
7  7    red   circle     2      false
8  8   blue   circle     9      false
9  9    red   square    12       true

由于我只想要独特的组合,因此我们需要一个新的“红色方块”列。应该只创建一次。对于数据框中不存在的所有可能组合(例如白色圆圈),不应创建列名称。

任何人都有我想要的解决方案吗?

1 个答案:

答案 0 :(得分:3)

我们可以使用table

cbind(df1, as.data.frame.matrix(with(df1, table(ID, paste(COLOR, SHAPE, sep="_"))!=0)))
# ID  COLOR    SHAPE VAR_X black_triangle blue_circle blue_triangle green_circle red_circle red_square white_square yellow_circle
#1  1    red   square     5          FALSE       FALSE         FALSE        FALSE      FALSE       TRUE        FALSE         FALSE
#2  2  green   circle     8          FALSE       FALSE         FALSE         TRUE      FALSE      FALSE        FALSE         FALSE
#3  3   blue triangle     3          FALSE       FALSE          TRUE        FALSE      FALSE      FALSE        FALSE         FALSE
#4  4  white   square     9          FALSE       FALSE         FALSE        FALSE      FALSE      FALSE         TRUE         FALSE
#5  5  black triangle     7           TRUE       FALSE         FALSE        FALSE      FALSE      FALSE        FALSE         FALSE
#6  6 yellow   circle     4          FALSE       FALSE         FALSE        FALSE      FALSE      FALSE        FALSE          TRUE
#7  7    red   circle     2          FALSE       FALSE         FALSE        FALSE       TRUE      FALSE        FALSE         FALSE
#8  8   blue   circle     9          FALSE        TRUE         FALSE        FALSE      FALSE      FALSE        FALSE         FALSE
#9  9    red   square    12          FALSE       FALSE         FALSE        FALSE      FALSE       TRUE        FALSE         FALSE