如何使用多个键定义data.table键以实现最快的聚合

时间:2013-11-14 19:21:52

标签: r performance data.table compound-key

我想更好地了解如何使用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]

有没有办法为xy使用密钥?

修改

设置xy的密钥是否会执行两次矢量搜索?即:

setkey(DT,x,y)

EDIT2

对不起,我意味着要问的是,当DT被x和y键入时,调用DT[!"bd",sum(v),by=y]会执行两次二进制扫描吗?

1 个答案:

答案 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]