如何在data.table中使用OR条件联接表

fil*_*tor 2 merge join r data.table

可以在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
Run Code Online (Sandbox Code Playgroud)

我尚未在文档中找到有关加入OR的信息。我错过了什么吗?

Uwe*_*Uwe 5

OP要求结果集应包含3个子集:

  1. 列上匹配的行 x
  2. 列上匹配的行 y
  3. data.table的其余行 X

所以,这是表的一种右外部联接XY对字段xy

可以将其转换为column xyresp。上的2个独立内部联接,两个结果集的并集以及最后一个外部联接以添加table中剩余的行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
Run Code Online (Sandbox Code Playgroud)

内部联接由parameter强制nomatch = 0。联合操作使用实现rbindlist(list(...))编辑: unique()如果在xz在同一行中X和在同一行中匹配则需要删除双重匹配Y这要感谢filius_arator指出)。

最终的右外部联接使用所有行,X包括尚未匹配的行。请注意,此连接位于的三列中X