【问题标题】:How can I reshape a data.table (long into wide) without doing a function like sum or mean?如何在不执行 sum 或 mean 之类的函数的情况下重塑 data.table(长到宽)?
【发布时间】:2015-02-05 10:30:11
【问题描述】:

如何在不执行summean 之类的功能的情况下重塑data.table(长到宽)? 我在看 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", ",")

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

【问题讨论】:

    标签: r data.table reshape reshape2 splitstackshape


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 谢谢一百万!我检查了哪个是最快的。 cSplit 使用的字符更少,但花费的时间几乎是所需时间的两倍。
    • @akrun 从那时起我一直在寻找这个。所以我提到了这个。感谢您提供非常好的答案!
    • @VeerendraGadekar 实际上,我并没有暗示您从这里获得灵感。我真的忘记了我是这样用的。我只是在取笑你思考过程背后的故事:-)
    • @akrun 我非常喜欢这种方法!并将其添加为书签。这太酷了! :)
    • @VeerendraGadekar 感谢您的慷慨 cmets。这让我很开心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2021-12-14
    • 2017-11-04
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多