2016-02-12 72 views
-3

我有近10m行,我只想从每组中选择前三行。按组加速data.table子集

我用

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

我需要得到结果

enter image description here

但它是非常缓慢的,因为10M它只是动车组。所以也许有任何想法如何优化这个。先谢谢你。

+1

嗨,欢迎来到SO。请考虑阅读[问]和如何产生[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。它使其他人更容易帮助你。 – Heroka

+0

你正在运行什么版本的'data.table'?您是否阅读过[二分查找](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-keys-fast-subset.html)小插曲? – MichaelChirico

+0

@MichaelChirico data.table 1.9.6 –

回答

2

您的示例不可重现。我建议阅读如何在R标签上提出SO问题以使R标签成为坚实的知识库而不是快速且更具时间性的Q & A.

对于偏题而言很抱歉。

使用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),以确保使用索引。

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

+0

最好的答案是'data [data [x == 1L | y> -6L,.I [1:3],by = z] $ V1]'。谢谢。 –

+0

@VitaliyRadchenko这取决于你的数据。如果您一次只使用一次不平等测试(如Jan在此答案中所做的那样),该包会进行特殊优化,因此在某些情况下可能会更快。 – Frank

+0

@VitaliyRadchenko通常取决于数据的基数。 – jangorecki