2

我正在合并两个数据框,一个主数据集和一个查找表,基于多个因素(关键)变量,我想快速查看主数据中这些关键变量的哪些组合没有在查找表中匹配。合并功能中是否有允许我这样做的选项?目前我能想到的最好的方法是使用 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"))
4

3 回答 3

3

据我所见,合并没有这个选项,但是通过 NA 进行子集化非常快速和容易。

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 ,]

举一个数据示例,也许有人可以提供更好的帮助

于 2012-09-24T22:44:44.350 回答
2

数据表版本:

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

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

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

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

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

于 2019-12-22T14:43:35.643 回答
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])
于 2012-09-25T00:52:09.067 回答