比较两个data.frames以查找data.frame 1中不存在于data.frame 2中的行

比较两个data.frames以查找data.frame 1中不存在于data.frame 2中的行

我有以下2个data.frames:


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

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

我想找到a1没有的行a1。


这种类型的操作是否有内置功能?


(ps:我确实为它编写了一个解决方案,如果有人已经制作了一个更精心设计的代码,我感到很好奇)


这是我的解决方案:


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

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


rows.in.a1.that.are.not.in.a2  <- function(a1,a2)

{

    a1.vec <- apply(a1, 1, paste, collapse = "")

    a2.vec <- apply(a2, 1, paste, collapse = "")

    a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,]

    return(a1.without.a2.rows)

}

rows.in.a1.that.are.not.in.a2(a1,a2)


HUWWW
浏览 717回答 3
3回答

明月笑刀无情

这不会直接回答您的问题,但它会为您提供共同的元素。这可以通过Paul Murrell的包来完成compare:library(compare)a1 <- data.frame(a = 1:5, b = letters[1:5])a2 <- data.frame(a = 1:3, b = letters[1:3])comparison <- compare(a1,a2,allowAll=TRUE)comparison$tM#&nbsp; a b#1 1 a#2 2 b#3 3 c该函数compare在允许哪种比较方面为您提供了很大的灵活性(例如,改变每个向量的元素顺序,改变变量的顺序和名称,缩短变量,改变字符串的大小写)。由此,您应该能够找出其中一个或哪个缺失的东西。例如(这不是很优雅):difference <-&nbsp; &nbsp;data.frame(lapply(1:ncol(a1),function(i)setdiff(a1[,i],comparison$tM[,i])))colnames(difference) <- colnames(a1)difference#&nbsp; a b#1 4 d#2 5 e

牛魔王的故事

SQLDF 提供了一个很好的解决a1 <- data.frame(a = 1:5, b=letters[1:5])a2 <- data.frame(a = 1:3, b=letters[1:3])require(sqldf)a1NotIna2 <- sqldf('SELECT * FROM a1 EXCEPT SELECT * FROM a2')以及两个数据框中的行:a1Ina2 <- sqldf('SELECT * FROM a1 INTERSECT SELECT * FROM a2')新版本dplyr有一个功能,anti_join正是为了这些类型的比较require(dplyr)&nbsp;anti_join(a1,a2)而semi_join过滤行的a1,同时也是在a2semi_join(a1,a2)
打开App,查看更多内容
随时随地看视频慕课网APP