未加入R中的&Q;(&Q;) [英] "Not Join" in R

查看:24
本文介绍了未加入R中的&Q;(&Q;)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种快速的方法来"不连接"(即保留未合并的行,或与内部连接相反的行)。我一直使用的方法是对X和Y使用data.table,然后设置关键点。例如:

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下面的答案更清楚。最后一个障碍是预置数据。表键,如果不必这样做就好了。

编辑:澄清一下,公认的解决方案是:

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中的&Q;(&Q;)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆