setkey和:=运算符,data.table,R

时间:2012-07-20 18:03:43

标签: r dataframe data.table apply

使用data.table包时,我有点不确定何时需要setkey()。例如,当:=运算符与by选项一起使用时,即使我没有设置密钥,事情似乎仍然非常快。有人可以在setkey()何时需要以及何时不需要时澄清?如果在使用:=调用by之前没有必要,那么data.table包的速度如此之快,因为它可能与标准apply中的data.frame做同样的事情{1}} R通过执行顺序搜索而不是二进制搜索,因为它不知道我的data.table是否实际按by的参数排序。

由于

1 个答案:

答案 0 :(得分:18)

这两个常见问题解答似乎很接近:

  

3.2我在大表上没有密钥,但分组仍然非常快。那是为什么?
  data.table使用基数排序。这明显快于其他排序算法。 Radix仅适用于整数,请参阅?base::sort.list(x,method="radix")。这也是setkey快速的一个原因。如果没有设置密钥,或者我们按照与密钥的顺序不同的顺序进行分组,我们称之为ad hoc。

     

3.3为什么按键中的列分组比ad hoc更快?
  因为每个组在RAM中是连续的,从而最大限度地减少了页面提取,并且可以批量复制内存(C中为memcpy)而不是在C中循环。

它没有说明,也可能应该做的是,你需要一个非常大的数据集,其中每个组也非常大,在你注意到keyed和ad hoc之间的区别之前。像100组每组100MB(10GB data.table),如1e8行和13列。否则,首先不需要setkey,特别是因为这可能会变得繁重。