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