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

问题描述 投票:2回答:1

我有一个大表(约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中转换它的任何建议?

r data.table reshape reshape2
1个回答
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

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


您可以尝试以下方法。我从来没有使用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
© www.soinside.com 2019 - 2024. All rights reserved.