我有这个数据
RES RANK1 RANK2 RANK3 RANK4 RANK5
1 3 3 5 16 1
2 3 1 2 5 16
3 3 5 15 10 1
如何融合数据,使得RANK1到RANK5的值成为变量,RANK1到RANK5成为值。
通过以下方式收集数据:在(22)项列表中,选择前5个首选项。
将分析新数据,就好像答案是多响应一样。
预期输出将是(例如,RES = 1)
RES 1 2 3 5 10 15 16
1 RANK5 RANK2 RANK3 RANK4
2 RANK2 RANK3 RANK1 RANK4 RANK5
3 RANK5 RANK1 RANK2 RANK4 RANK3
谢谢!
答案 0 :(得分:3)
您需要melt
您的数据,然后dcast
。由于您没有针对每种组合的唯一值,因此当您拥有多个值时,您需要一些方法来保留所有值(如RES == 1
和VALUE == 3
所示)。在这种情况下,我们只使用paste
和collapse
参数将值连接起来:
dcast( melt( df , measure = 2:6 ) , RES ~ value , value.var = "variable" , fun = function(x) paste(x,collapse=";") , fill = "" )
# RES 1 2 3 5 10 15 16
#1 1 RANK5 RANK1;RANK2 RANK3 RANK4
#2 2 RANK2 RANK3 RANK1 RANK4 RANK5
#3 3 RANK5 RANK1 RANK2 RANK4 RANK3
使用melt
列作为度量变量的RANK*
的效果是为我们提供一个包含两列id变量的长数据集,如此
head( melt( df , measure = 2:6 ) )
# RES variable value
#1 1 RANK1 3
#2 2 RANK1 3
#3 3 RANK1 3
#4 1 RANK2 3
#5 2 RANK2 1
#6 3 RANK2 5