r - R中的“不加入”

标签 r merge inner-join data.table outer-join

我正在寻找一种快速的方法来执行``不连接''(即保留未合并的行或内部连接的逆行)。我一直在做的方法是对X和Y使用data.table,然后设置key。例如:

require(data.table)

X <- data.table(category = c('A','B','C','D'), val1 = c(0.2,0.3,0.8,0.7))
Y <- data.table(category = c('B','C','D','E'), val2 = c(2,3,5,7))
XY <- merge(X,Y,by='category')

> XY
   category val1 val2
1:        B  0.3    2
2:        C  0.8    3
3:        D  0.7    5


但是我需要与此相反,所以我必须这样做:

XY_All <- merge(X,Y,by='category',all=TRUE)
setkey(XY,category)
setkey(XY_All,category)
notXY <- XY_All[!XY]    #data.table not join (finally)

> notXY
   category val1 val2
1:        A  0.2   NA
2:        E   NA    7


我觉得这很漫长(特别是从data.frame)。我想念什么吗?

编辑:我更多地考虑不加入后得到了这个

X <- data.table(category = c('A','B','C','D'), val1 = c(0.2,0.3,0.8,0.7),key = "category")
Y <- data.table(category = c('B','C','D','E'), val2 = c(2,3,5,7), key = "category")
notXY <- merge(X[!Y],Y[!X],all=TRUE)


但是,以下WheresTheAnyKey的答案更为清楚。最后一个障碍是预设data.table键,最好不要这样做。

编辑:澄清一下,可接受的解决方案是:

merge(anti_join(X, Y, by = 'category'),anti_join(Y, X, by = 'category'), by = 'category', all = TRUE)

最佳答案

require(dplyr)
rbind_list(anti_join(X, Y), anti_join(Y, X))


编辑:
由于有人要求解释,因此发生了以下情况:

第一个anti_join()函数从X返回行,这些行在Y中没有匹配的行,该匹配由联接所基于的行确定。第二个则相反。 rbind_list()只是将其输入的结果放入所有输入的所有观察值中,并用一个单独的tbl代替,将丢失的变量数据替换为NA

关于r - R中的“不加入”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190444/

相关文章:

SQL 服务器 : join on uniqueidentifier

MySQL Select with several join 首先对连接表进行全表扫描

r - 使用circlize设置弦图的扇区宽度

Git:主要版本更改的分段 merge 方法?

Git Merge Recursive Ours - 命令语法示例

mysql - 返 repo 买日期在注册日期后 7 天内的所有结果

python - 在 docker 镜像中安装 R

R 数据帧按类别 ID 筛选多个逻辑条件

r - ggplot2:在 ROC 图上使用 scale_x_reverse

r - 当两个数据帧的列和行不同时,tidyverse 替代 left_join 和 rows_update