如何使用多列和多个值连接data.table

时间:2014-09-01 15:13:00

标签: r performance data.table binary-search

示例是:

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%运算符的简单性?

1 个答案:

答案 0 :(得分:1)

回答从DT标签打开问题中删除此问题 来自Arun的评论DT[CJ(xc,yc), nomatch=0L]的代码将完成这项工作。