我想更好地了解如何使用keyd data.table
。阅读文档后,我想我了解如何在使用一个密钥时加快子集化。例如:
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"]
在这种情况下,选项1比选项2慢得多,因为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)
EDIT2
对不起,我意味着要问的是,当DT被x和y键入时,调用DT[!"bd",sum(v),by=y]
会执行两次二进制扫描吗?
答案 0 :(得分:1)
我相信当数据表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]