在 data.table 中是否可以使用 OR 条件连接表?
例如:
library(data.table)
X<-data.table(x=c('a','b','c','d','e','f'),y=c(1,1,2,2,3,3),z=c(10,11,12,13,14,15))
x y z
1: a 1 12
2: b 1 11
3: c 2 12
4: d 2 13
5: e 3 14
6: f 3 15
Y<-data.table(x=c('a','e','a'),z=c(12,20,14),t=c('a','b','c'))
x z t
1: a 12 a
2: e 20 b
3: a 14 c
# and i need something like this:
X[Y,on=c("x"|"z"),.(x,y,z,i.t)]
x y z t
1: a 1 10 a
2: a 1 10 c
3: b 1 11 NA
4: c 2 12 a
5: d 2 13 NA
6: e 3 14 b
7: e 3 14 c
8: f 3 15 NA
我没有在文档中找到有关加入 OR 的信息。 我错过了什么吗?
最佳答案
OP 要求结果集应包含 3 个子集:
- 匹配列
x
的行 - 匹配列
y
的行 - data.table 的剩余行
X
所以,这是表 X
的一种右外连接与 Y
在任一列上 x
或 y
.
这可以转换为列 x
上的 2 个单独的内部联接和 y
resp.,两个结果集的并集,以及最终的外部连接以添加表 X
中的剩余行.
合二为一data.table
声明这变成了
unique(rbindlist(list(
X[Y, on = "x", .(x, y, z, t), nomatch = 0],
X[Y, on = "z", .(x, y, z, t), nomatch = 0]
)))[X, on = .(x, y, z)]
# x y z t
#1: a 1 10 a
#2: a 1 10 c
#3: b 1 11 NA
#4: c 2 12 a
#5: d 2 13 NA
#6: e 3 14 b
#7: e 3 14 c
#8: f 3 15 NA
内部连接由参数 nomatch = 0
强制执行.联合操作是使用 rbindlist(list(...))
实现的. 编辑: unique()
在 x
的情况下需要删除双重匹配和 z
在 X
中的同一行中匹配在Y
(thanks to filius_arator for pointing this out)。
最后的右外连接使用了 X
的所有行包括那些尚未匹配的。请注意,此连接位于 X
的三列上.
关于r - 如何在 data.table 中使用 OR 条件连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788641/