R从短格式转换为长格式,以简短形式计数[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R从短格式转换为长格式,以简短形式计数[重复]相关的知识,希望对你有一定的参考价值。

我有一个大表(约100M行和28列),格式如下:

ID  A   B   C
1   2   0   1
2   0   1   0
3   0   1   2
4   1   0   0

除ID之外的列(唯一的)给出每种类型的计数(即A,B,C)。我想把它转换成下面的长形式。

ID  Type
 1   A
 1   A
 1   C
 2   B
 3   B
 3   C
 3   C
 4   A

考虑到我的数据集的大小,我也想使用数据表(而不是数据帧)。我检查了reshape2中的R包关于长形和短形之间的转换但是我不清楚melt函数是否允许我在上面的简短形式中计数。

关于如何使用R和/或reshape2以快速有效的方式在data.table中转换它的任何建议?

答案

更新

您可以尝试以下方法:

DT[, rep(names(.SD), .SD), by = ID]
#    ID V1
# 1:  1  A
# 2:  1  A
# 3:  1  C
# 4:  2  B
# 5:  3  B
# 6:  3  C
# 7:  3  C
# 8:  4  A

保持你想要的订单......


您可以尝试以下方法。我从来没有使用expandRows会变成~3亿行,但它基本上是rep,所以它不应该慢。

这使用了我的“splitstackshape”包中的melt + expandRows。它适用于data.frames或data.tables,所以你不妨使用data.table更快融化....

library(reshape2)
library(splitstackshape)
expandRows(melt(mydf, id.vars = "ID"), "value")
# The following rows have been dropped from the input: 
# 
# 2, 3, 5, 8, 10, 12
# 
#      ID variable
# 1     1        A
# 1.1   1        A
# 4     4        A
# 6     2        B
# 7     3        B
# 9     1        C
# 11    3        C
# 11.1  3        C

以上是关于R从短格式转换为长格式,以简短形式计数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将宽格式转换为长格式,然后嵌套列

PHP 将速记日期转换为长格式

将速记日期转换为长格式

将值列表添加到行,然后将数据框转换为长格式

C:如何将字符串转换为长整数格式的整数

在 data.table 中拆分字符串并转换为长格式的快速方法