7

我试图更好地理解使用 keyd data.tables。阅读文档后,我想我了解如何在使用一键时加快子集化。例如:

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

编辑

是否将键设置为两者xy执行两个向量搜索?IE:

setkey(DT,x,y)

编辑2

抱歉,我的意思DT[!"bd",sum(v),by=y]是当 DT 由 x 和 y 键入时,调用会执行两次二进制扫描吗?

4

1 回答 1

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]
于 2014-08-25T16:59:57.740 回答