我正在合并两个数据框,一个主数据集和一个查找表,基于多个因子(键)变量,我想快速查看主要的这些关键变量的组合数据在查找表中不匹配。合并功能中有一个选项可以让我这样做吗?我现在能想到的最好的方法是使用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"))
答案 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。