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

R converting from short form to long form with counts in the short form

我有一个大的 table(~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

鉴于我的数据集的大小,我还想使用数据 table(而不是数据框)。我在 R 中检查了 reshape2 包关于长格式和短格式之间的转换,但是我不清楚 melt 函数是否允许我像上面那样以短格式进行计数。

关于如何在 R 中使用 reshape2 and/or 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