R从短格式转换为长格式,以短格式计数

时间:2015-09-08 17:29:35

标签: r data.table reshape reshape2

我有一个大表格(~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快速有效地转换此内容的任何建议?

1 个答案:

答案 0 :(得分:5)

更新

您可以尝试以下操作:

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

保持你想要的顺序......

您可以尝试以下操作。我从来没有在{3}行上使用expandRows,但它基本上是rep,所以它不应该很慢。

这会使用我的“splitstackshape”包中的melt + expandRows。它适用于data.framedata.table s,所以您也可以使用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