3

如何在不执行ordata.table之类的功能的情况下重塑(长到宽)?我在看 dcast/melt/reshape/等。但我没有得到想要的结果。summean

这是我的数据:

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")

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

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

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

4

1 回答 1

4

您可以使用为分组变量getanID创建唯一的。然后,尝试使用(或简单地从 1.9.5 及更高版本开始),如果需要,使用更改列名.ididdcast.data.tabledcastsetnames

 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
于 2014-12-07T19:07:01.650 回答