【发布时间】:2013-04-02 16:54:22
【问题描述】:
如果我将 n 列指定为 data.table 的键,我知道只要我加入 key(DT) 的 head,我就可以加入比该键中定义的更少的列。例如,对于 n=2 :
X = data.table(A=rep(1:5, each=2), B=rep(1:2, each=5), key=c('A','B'))
X
A B
1: 1 1
2: 1 1
3: 2 1
4: 2 1
5: 3 1
6: 3 2
7: 4 2
8: 4 2
9: 5 2
10: 5 2
X[J(3)]
A B
1: 3 1
2: 3 2
那里我只加入了DT 的两列键的第一列。我知道我可以像这样加入键的两列:
X[J(3,1)]
A B
1: 3 1
但是我如何只使用键的第二列(例如B==2)进行子集化,但仍然使用二进制搜索而不是矢量扫描?我知道这是重复的:
Subsetting data.table by 2nd column only of a 2 column key, using binary search not vector scan
所以我想将这个问题概括为n。我的数据集有大约一百万行,上面链接的 dup 问题中提供的解决方案似乎不是最佳的。
【问题讨论】:
-
只是
X[B==2,]。推荐阅读:cran.r-project.org/web/packages/data.table/vignettes/… -
@MatthewPlourde,你确定吗?您引用的小插图有以下句子,使您的解决方案听起来不太理想:“我们使用密钥来利用表已排序的事实,并使用二进制搜索来查找匹配的行。我们没有矢量扫描;我们没有使用 ==。”
-
我可能已经把它标记为重复了...
-
@GSee 对我来说似乎是一个骗局。对 dup 的公认答案很好,但我们希望做得更好;例如当
set2key实现时。 -
@MatthewDowle 该解决方案没有为 OP 的数据提供正确的结果。
标签: r data.table