【发布时间】: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