r - 如何在 data.table 中使用 OR 条件连接表

标签 r join merge 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

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

最佳答案

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

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

所以,这是表 X 的一种右外连接与 Y在任一列上 xy .

这可以转换为列 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 的情况下需要删除双重匹配和 zX 中的同一行中匹配在Y (thanks to filius_arator for pointing this out)。

最后的右外连接使用了 X 的所有行包括那些尚未匹配的。请注意,此连接位于 X 的三列上.

关于r - 如何在 data.table 中使用 OR 条件连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788641/

相关文章:

mysql如何合并/加入/完成信息从1行到同一表的其他行

r - 在 R 版本 4.0.0 中导入 .txt 文件,其中数据包含在 { } 中

MySQL 对重复的多个列产生不同的结果

r - 如何覆盖导入中列出的 R 包中的导出函数

MySQL JOINS 不带 where 子句

postgresql - Postgresql 下的连接中未使用 JSON 表达式索引

git 将两个存储库 merge 到一个新的存储库中,其中一个应该是一个分支

java - java无效归并排序方法

R - 来自两列的加权邻接矩阵

r - lubridate - 从日期中提取两位数的日期