R 如何连接具有多列和多个值的data.table
下面是一个例子:R 如何连接具有多列和多个值的data.table,r,performance,data.table,binary-search,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()只返回一行。实际上,我想以%操作员的身份加入 DT[x %in% xc & y %in% yc] x y z 1: 1 6 3 2: 4 9 6 但是在%操作符中使用%会使搜索成为
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()
只返回一行。实际上,我想以%操作员的身份加入
DT[x %in% xc & y %in% yc]
x y z
1: 1 6 3
2: 4 9 6
但是在%操作符中使用%会使搜索成为向量扫描,与二进制搜索相比速度非常慢。为了进行二进制搜索,我构建了连接值的所有可能组合:
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会使代码难以阅读。在这种情况下,有没有更好的方法来提高二进制搜索的速度和%
运算符中%的简单性?通过回答从DT标记开放式问题中删除此问题。
阿伦评论中的代码DT[CJ(xc,yc),nomatch=0L]
将完成这项工作。我认为您正在寻找交叉连接-这就是功能CJ
。尝试DT[CJ(xc,yc),nomatch=0L]
。请随意将此作为答案发布(如果正确)并接受它。