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