我试图更好地理解使用键控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
执行两个向量搜索吗?即:
setkey(DT,x,y)
编辑2
抱歉,我想问的是,当DT由x和y键控时,调用DT[!"bd",sum(v),by=y]
执行两次二进制扫描吗?
当数据表 DT 同时由 x 和 y 键控时,不可能执行两次二进制扫描。相反,我会先在 x 上重复键控,然后在 y 上重复键控,如下所示:
DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=as.character(c(1,3,4)), v=1:9)
setkey(DT,x)
tmp = DT[!"bd"]
setkey(tmp,y)
tmp[!"1",sum(v),by=y]