从合并中返回不匹配的记录

时间:2012-09-24 21:52:57

标签: r merge

我正在合并两个数据框,一个主数据集和一个查找表,基于多个因子(键)变量,我想快速查看主要的这些关键变量的组合数据在查找表中不匹配。合并功能中有一个选项可以让我这样做吗?我现在能想到的最好的方法是使用all.x = T选项,然后查看我合并的其中一个变量为NA的行。肯定有一个更好的方法......

这是我的代码,它的价值是什么:

a.lighting.all.2 <- merge(a.lighting.all.2, a.lookup.by.meas.2,
                          by = c("measure.category", "measure.subcategory",
                                 "measure", "fund.category"))

3 个答案:

答案 0 :(得分:2)

据我所知,merge没有这个选项,但NAs的子集虽然非常简单快捷。

df      <- data.frame(cat=c("a","a","b","b"),num=(1:4))
df2     <- data.frame(cat=c("a","a","b","c"),num=(1:4))
mergedf <- merge(df,df2,by="cat",all=TRUE)
mergedf
mergedf [rowSums(is.na(mergedf))>0 ,] # not if you have NAs already before merge

你也可以做这样的事情:

df2 [ !df2$cat %in% df$cat ,]

并且对于未合并的特定行:

df$ID   <- 1:length(df[,1])
df2$ID  <- (length(df[,1])+1):(length(df[,1])+length(df2[,1]))
mergedf <- merge(df,df2,by="cat", all=FALSE)

df2 [!df2$ID %in% mergedf$ID.y ,]

以数据为例,也许有人可以提供更好的帮助

答案 1 :(得分:1)

这是一个用于区分具有相同标题的两个data.frame的函数:

df.diff <- function(df1, df2) {
   is.dup <- duplicated(rbind(df2, df1))
   is.dup <- tail(is.dup, nrow(df1))
   df1[!is.dup, ]
}

所以你可以跑:

df.diff(main[by.cols], lookup[by.cols])

答案 2 :(得分:0)

data.table版本:

library(data.table)
df1      <- data.table(cat=c("a","a","b","b"),num=(1:4))
df2     <- data.table(cat=c("a","a","b","c"),num=(1:4))

df1[!df2, on=.(cat,num)]
   cat num
1:   b   4

df2[!df1, on=.(cat,num)]
   cat num
1:   c   4

或者,设置键,然后删除括号中的on。