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

day*_*yne 7 performance r compound-key data.table

我想更好地了解利用凯迪德data.table.阅读文档后,我想我了解如何在使用一个密钥时加快子集化.例如:

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9)
Run Code Online (Sandbox Code Playgroud)

方案一:

DT[x == "ad"]
Run Code Online (Sandbox Code Playgroud)

方案二:

setkey(DT,x)
DT["ad"]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,选项1比选项2慢得多,因为data.table使用键更有效地搜索(使用二进制搜索与矢量扫描,我不理解,但我相信会更快.)

在使用by语句聚合数据子集的情况下,定义密钥的最快方法是什么?我应该键入我用于对数据进行子集化的列,还是定义组的列?例如:

setkey(DT,x)
DT[!"bd",sum(v),by=y]
Run Code Online (Sandbox Code Playgroud)

要么

setkey(DT,y)
DT[!"bd",sum(v),by=y]
Run Code Online (Sandbox Code Playgroud)

是否有利用两个键的方式xy

编辑

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

setkey(DT,x,y)
Run Code Online (Sandbox Code Playgroud)

EDIT2

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

Mas*_*edi 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]
Run Code Online (Sandbox Code Playgroud)