我试图更好地理解使用 keyd data.table
s。阅读文档后,我想我了解如何在使用一键时加快子集化。例如:
DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9)
选项一:
DT[x == "ad"]
选项二:
setkey(DT,x)
DT["ad"]
在这种情况下,选项一比选项二慢得多,因为 data.table 使用密钥来更有效地搜索(使用二分搜索与矢量扫描,我不明白,但我相信会更快。)
在使用 by 语句聚合数据子集的情况下,定义键的最快方法是什么?我应该键入用于子集数据的列还是定义组的列?例如:
setkey(DT,x)
DT[!"bd",sum(v),by=y]
或者
setkey(DT,y)
DT[!"bd",sum(v),by=y]
有没有办法同时为x
和使用密钥y
?
编辑
是否将键设置为两者x
并y
执行两个向量搜索?IE:
setkey(DT,x,y)
编辑2
抱歉,我的意思DT[!"bd",sum(v),by=y]
是当 DT 由 x 和 y 键入时,调用会执行两次二进制扫描吗?