比较两个具有不同列的data.frames,以查找data.frame 1中缺少的行

时间:2016-06-24 03:15:53

标签: r dplyr

我有两个数据帧,如下所示,

a1 <- data.frame(a = 1:5, b=letters[1:5], c = 1:5)
a2 <- data.frame(a = 1:3, b=letters[1:3], d = 1:3)

我想找到a2相对于前两列(a,b)单独存在的行a1。我理想的输出应该是,

  a b c match
1 1 a 1  yes
2 2 b 2  yes
3 3 c 3  yes
4 4 d 4   no
5 5 e 5   no

我尝试了以下内容,

output <- sqldf('SELECT * FROM a1 EXCEPT SELECT * FROM a2')

但只有当两个数据帧上的列相等且名称相同时,才会起作用。但我想只找到(a,b)列中的匹配项,并在a1中输出是/否。

有人可以帮我找到这个吗?

3 个答案:

答案 0 :(得分:4)

我们可以执行merge并找到NA

c("no", "yes")[(!is.na(merge(a1, a2, by = c("a", "b"), all.x=TRUE)$d))+1L]
#[1] "yes" "yes" "yes" "no"  "no" 

如果没有merge,我们可以paste将这些列放在一起并与%in%进行比较,并将逻辑转换为“是/否”

c('no', 'yes')[(paste(a1$a, a1$b) %in% paste(a2$a, a2$b))+1]
#[1] "yes" "yes" "yes" "no"  "no" 

或使用dplyr

library(dplyr)
left_join(a1, a2, by = c("a", "b")) %>%
           mutate(d = c("no", "yes")[(!is.na(d))+1])
#   a b c   d
# 1 1 a 1 yes
# 2 2 b 2 yes
# 3 3 c 3 yes
# 4 4 d 4  no
# 5 5 e 5  no

答案 1 :(得分:2)

使用库row.match中的函数prodlim。这将返回一个带(第一个)匹配数和NA的向量。将其与ifelse结合使用以指定是/否。

library(prodlim)
a1$match <- ifelse(is.na(row.match(a1, a2)), "no", "yes")     

#  a b c match
#1 1 a 1   yes
#2 2 b 2   yes
#3 3 c 3   yes
#4 4 d 4    no
#5 5 e 5    no

答案 2 :(得分:1)

还有另一种选择。您可以使用match_df包的plyr功能。

library(plyr)
a1$match <- ifelse(row.names(a1) %in% row.names(match_df(a1,a2)),"yes","no")

<强>输出

  a b c match
1 1 a 1   yes
2 2 b 2   yes
3 3 c 3   yes
4 4 d 4    no
5 5 e 5    no