【问题标题】:Speed up data.table subsetting by group按组加速 data.table 子集
【发布时间】:2016-02-12 14:31:04
【问题描述】:

我有近 10m 行,我只想从每组中选择前三行。

我用

data[x == 1 | y > -6, .SD[1:3], by = z]

我需要得到结果

但它很慢,因为10M它只是火车集。所以也许有任何想法如何优化它。提前谢谢你。

【问题讨论】:

  • 嗨,欢迎来到 SO。请考虑阅读How to Ask 以及如何生成reproducible example。它使其他人更容易帮助您。
  • 您运行的是哪个版本的data.table?你读过binary search 小插图吗?
  • @MichaelChirico data.table 1.9.6
  • Update to the development version -- 最近有一些GForce 优化了您正在执行的操作。
  • 尝试data[data[x == 1L | y > -6L, .I[1:3], by=z]$V1],直到优化此案例。

标签: r data.table


【解决方案1】:

您的示例不可重现。我建议阅读如何在 R 标签上提出 SO 问题,以使 SO 上的 R 标签成为一个坚实的知识库,而不是快速和更临时的问答。

抱歉跑题了。

使用 data.table 索引时,您可能会获得显着的加速。它目前只需要过滤单个变量。在你的情况下,你看起来像:

set2key(data, x)
ix = data[x == 1, which = TRUE]
iy = data[y > -6, which = TRUE] # this will not use index (yet)!
data[union(ix, iy), ...]

使用options("datatable.verbose"=TRUE) 确保您正在使用索引。

由于缺少数据样本,代码不可重现。所以我不能提供任何基准,这可能是有价值的,因为潜在的加速取决于数据,并且可能导致减速。

【讨论】:

  • 最佳答案是data[data[x == 1L | y > -6L, .I[1:3], by=z]$V1]。谢谢。
  • @VitaliyRadchenko 这取决于您的数据。当您一次使用一个不等式测试时,该包会进行特殊优化(正如 Jan 在此答案中所做的那样),因此在某些情况下它可能会更快。
  • @VitaliyRadchenko 通常它取决于数据的基数。
猜你喜欢
  • 2012-12-08
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2013-07-03
  • 2013-04-17
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多