如何在不执行sum或mean等函数的情况下重塑data.table(long to wide)?

时间:2014-12-07 19:05:02

标签: r data.table reshape reshape2 splitstackshape

如何在不执行data.tablesum等功能的情况下重新塑造mean(长到宽)? 我正在看dcast / melt / reshape /等。 但我没有得到预期的结果。

这是我的数据:

DT <- data.table(id = c("1","1","2","3"), score = c("5", "4", "5", "6"))

原始格式:

> DT
id score
1  5 
1  4 
2  5 
3  6 

所需格式:

id score1 score2
1  5      4
2  5      NA
3  6      NA 

我现在用诀窍来做:

DT <- DT[, list(list(score)), by=id]

但是第一个单元格的内容就像:

c("5", "4")

我需要拆分它(我使用包splitstackshape):

DT <- cSplit(DT, "V1", ",")

这可能不是最有效的方法...... 什么是更好的方式?

1 个答案:

答案 0 :(得分:4)

您可以使用getanID为分组变量.id创建唯一的id。然后,尝试使用dcast.data.table(或只是版本1.9.5及更高版本中的dcast),如果需要,请使用setnames

更改列名称
 library(splitstackshape)
 res <- dcast(getanID(DT, 'id'), id~.id,value.var='score')
 setnames(res, 2:3, paste0('score', 1:2))[]
 #    id score1 score2
 #1:  1      5      4
 #2:  2      5     NA
 #3:  3      6     NA

或仅使用data.table

 dcast(DT[, .id:=paste0('score', 1:.N), by=id],
       id~.id, value.var='score')
 #   id score1 score2
 #1:  1      5      4
 #2:  2      5     NA
 #3:  3      6     NA

或者您使用的代码(字符数较少)

cSplit(DT[, toString(score), by=id], 'V1', ',')
#   id V1_1 V1_2
#1:  1    5    4
#2:  2    5   NA
#3:  3    6   NA