一个示例案例在这里:
DT = data.table(x=1:4, y=6:9, z=3:6)
setkey(DT, x, y)
连接列具有多个值:
xc = c(1, 2, 4)
yc = c(6, 9)
DT[J(xc, yc), nomatch=0]
x y z
1: 1 6 3
J()
的这种用法仅返回单行。实际上,我想以%in%
运算符的身份加入。DT[x %in% xc & y %in% yc]
x y z
1: 1 6 3
2: 4 9 6
但是,使用
%in%
运算符会使搜索成为矢量扫描,与二进制搜索相比非常慢。为了进行二进制搜索,我建立了连接值的所有可能组合:xc2 = rep(xc, length(yc))
yc2 = unlist(lapply(yc, rep, length(xc)))
DT[J(xc2, yc2), nomatch=0]
x y z
1: 1 6 3
2: 4 9 6
但是以这种方式构建xc2,yc2会使代码难以阅读。在这种情况下,是否有更好的方法来提高二进制搜索的速度和
%in%
运算符的简单性? 最佳答案
回答以从DT标签 Unresolved 问题中删除此问题。
来自Arun注释DT[CJ(xc,yc), nomatch=0L]
的代码将完成此工作。