【问题标题】:R: speed up 'table()' operation for a data.table objectR:加快 data.table 对象的“table()”操作
【发布时间】:2015-02-18 20:17:50
【问题描述】:

我想通过使用table 函数将 data.table 对象转换为以下条件。这意味着,colb 作为列名,cola 作为行名,然后如果单个col 包含相应的row,则将条目作为1,否则将0。我是这样做的:

dt <- data.table(cola = c(1, 1, 2, 3), colb = c(10, 20, 30, 40))
dt
table(dt)

> dt
   cola colb
1:    1   10
2:    1   20
3:    2   30
4:    3   40
> table(dt)
colb
cola 10 20 30 40
   1  1  1  0  0
   2  0  0  1  0
   3  0  0  0  1

但是当数据集很大时,例如在我的例子中,3900 万行乘 2 列,表操作需要大约 80 秒才能完成。

我想知道有没有更有效的方法来做和表函数一样的事情?

另外,dcast.data.table(dt, cola ~ colb, fill = 0L) 在我尝试的时候做同样的事情,但是结果有一点不同,应该进一步处理以获得与表函数相同的结果。重要的是dcast.data.table 在我尝试数据时不会提高速度。所以,我希望有人可以帮助找出更有效的方法来做同样的事情!

谢谢。

【问题讨论】:

  • 令人惊讶的是dcast()table() 具有相同的性能.. 以前从未听说过。在任何情况下,性能问题都很难回答,除非我们可以访问您正在处理的数据(或至少是模拟数据)。另外,请发布您的sessionInfo() 输出。
  • 我也很惊讶 table 操作在有 700 万行的 data.table 中似乎比在数据框中慢。我正在使用较旧的 Mac SL -build 但当前版本和 data.table 1.9.4。我在“[”中将表操作作为 j 参数进行。我发现其他更复杂的功能很难移植到 data.table 中,所以我只是回到了旧的数据框方式。
  • @BondedDust 什么样的复杂函数?也许发布一个问题,我们会尽力解决。
  • @Arun: > sessionInfo() R 版本 3.1.1 (2014-07-10) 平台:x86_64-unknown-linux-gnu (64-bit) 语言环境:[1] C 附加的基础包:[1] stats graphics grDevices utils datasets 方法基于其他附加包:[1] BiocInstaller_1.16.1 data.table_1.9.5 通过命名空间加载(未附加):[1] chron_2.3-45
  • 对于未来,(简要地)解释实际任务会节省大家的时间。

标签: r data.table


【解决方案1】:

首先,感谢@Arun 和所有人。是的,sparseMatrix 可以解决我原来的问题。这里我列出了答案(根据Arun's suggestion)。这里只是一个演示示例I originally hope

dt <- data.table(sid = c(1, 2, 3, 4, 3, 2, 1, 6, 1, 2), 
                 aid = c(100, 100, 100, 100, 200, 200, 200, 300, 300, 300))
dt
library(Matrix)
sm <- sparseMatrix(dt[, sid], dt[, aid], x = TRUE)   
cp <- t(sm) %*% sm   
cp <- summary(cp)  
cp <- cp[cp$i < cp$j, ]     
as.data.frame(cp)
    i   j x
4 100 200 3
7 100 300 2
8 200 300 2

这个方法比我以前用的更有效('Ananda Mahto' method)。我的数据集(39763098 行和 2 列)的时间比较:我的原始方法和 Arun 的方法分别为 ~141 秒 VS ~40 秒。所以谢谢,它是完美的。 其次,希望对于我当前帖子的问题,data.table 也可以有所改进。你会的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多