我正在寻找一种快速的方法来“不加入”(即保留未合并的行,或内部联接的逆)。我一直在做的方法是使用 data.table 作为 X 和 Y,然后设置键。例如:
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)