如何在不使用sum或mean等函数的情况下重塑数据表格(从长格式到宽格式)?

3

如何将 data.table(长格式)转换为宽格式而不使用像 summean 这样的函数?我正在查看 dcast/melt/reshape 等方法,但是没有得到期望的结果。

这是我的数据:

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

Original format:

> 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个回答

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

1
@akrun 我从那时开始就一直在寻找这个。所以我参考了这个。非常感谢你提供的非常好的答案! - Veerendra Gadekar
1
@VeerendraGadekar 实际上,我并没有暗示你从这里得到了灵感。我真的忘记我曾经这样使用它了。我只是在逗你有关你思考过程背后的故事 :-) - akrun
1
@akrun 我非常喜欢这种方法!我已经收藏了它。太酷了! :) - Veerendra Gadekar
1
@VeerendraGadekar 谢谢您慷慨的评论。这让我一整天都很开心! - akrun
Akrun,你能帮忙解决这个相关的问题吗?https://dev59.com/yJ3ha4cB1Zd3GeqPTmEy#41163691 那里提供的答案不能满足要求。 - skan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接