2012-07-20 85 views
17

使用data.table包时,我有点不确定何时需要setkey()。例如,当使用:=运算符和by选项时,即使我没有设置密钥,事情似乎仍然非常快。有人可以解释什么时候setkey()是必要的,什么时候不是?如果在调用:=之前没有必要使用by那么data.table包是如此之快,因为大概它必须通过执行顺序搜索而不是二进制搜索而在标准data.frame R中执行与apply相同的操作,因为它没有知道我的data.table是否实际按参数by排序。setkey和:=运算符,data.table,R

感谢

回答

18

这2个常见问题似乎接近:

3.2我没有上一大桌的关键,但分组仍然是真正的快。这是为什么?
data.table使用基数排序。这比其他排序算法显着更快。基数仅用于整数,参见?base::sort.list(x,method="radix")。这也是为什么setkey很快的原因之一。当没有密钥设置,或者我们按照与密钥不同的顺序进行分组时,我们称它为特设。

3.3为什么在按键中按列分组的速度要快于临时按?
因为每个组是在连续的RAM,从而最小化页面取和存储器可以在本体(memcpy在C)被复制,而不是在C.

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

+1

太棒了,谢谢!正在挖掘FAQ,并且一定错过了这个。 – Alex 2012-07-20 19:32:21

+0

'ad hoc by'是否快速,因为它也使用基数排序? – colinfang 2013-08-18 23:42:11

+1

@colinfang很难回答这个问题,因为有几个功能。原因因查询和数据而异。 Ad hoc'by'确实使用基数排序来查找整数列的组,因此它取决于类型和有多少列正在被'取代'。然后一旦找到了这些组,分组速度快的一个原因是因为内存被分配给了最大的组,一次预先分配给所有组,然后被重用。只适用于'j'所需的列。参见FAQ 3.1。尝试'verbose = TRUE'模式,因为它揭示了花费多少时间找到组(比如基数排序)和迭代它们。 – 2013-08-19 20:23:23