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

Ale*_*lex 18 r apply dataframe data.table

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

谢谢

Mat*_*wle 19

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

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

3.3为什么密钥中的列按比ad hoc更快的分组?
因为每个组在RAM中是连续的,从而最小化页面提取,并且可以批量复制内存(memcpy在C中)而不是在C中循环.

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