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的信息。我错过了什么吗?
OP要求结果集应包含3个子集:
x
y
X
所以,这是表的一种右外部联接X
与Y
对字段x
或y
。
可以将其转换为column x
和y
resp。上的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()
如果在x
和z
在同一行中X
和在同一行中匹配则需要删除双重匹配Y
(这要感谢filius_arator指出)。
最终的右外部联接使用所有行,X
包括尚未匹配的行。请注意,此连接位于的三列中X
。
归档时间: |
|
查看次数: |
700 次 |
最近记录: |