我有两个数据帧,如下所示,
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中输出是/否。
有人可以帮我找到这个吗?
答案 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