【问题标题】:R converting from short form to long form with counts in the short form [duplicate]R从短形式转换为长形式,以短形式计数[重复]
【发布时间】:2015-12-04 11:53:22
【问题描述】:

我有一个大表(约 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

考虑到我的数据集的大小,我还想使用数据表(而不是数据框)。我检查了R 中的reshape2 包关于在长格式和短格式之间转换的问题,但是我不清楚melt 函数是否允许我以上述短格式进行计数。

关于如何在R 中使用reshape2 和/或data.table 快速有效地转换它有什么建议吗?

【问题讨论】:

  • 你检查过reshaping data.tables vignette吗?
  • @Arun 小插图似乎没有表中存在频率的示例。
  • @KTY,您尝试过我在回答中分享的解决方案吗?
  • @AnandaMahto 感谢您的回复。我按照您的建议使用了melt,因为它使用数据表更快。对于第二步,我没有使用expandRows,而是将具有多个计数的行分开,然后replicated ID 和类型仅按计数排列,然后merged 将其与原始表分开。似乎工作得很快。

标签: r data.table reshape reshape2


【解决方案1】:

更新

您可以尝试以下方法:

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.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多