为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUWWW 2019-07-31 15:16:58
比较两个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)
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这不会直接回答您的问题,但它会为您提供共同的元素。这可以通过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

#  a b

#1 1 a

#2 2 b

#3 3 c

该函数compare在允许哪种比较方面为您提供了很大的灵活性(例如,改变每个向量的元素顺序,改变变量的顺序和名称,缩短变量,改变字符串的大小写)。由此,您应该能够找出其中一个或哪个缺失的东西。例如(这不是很优雅):


difference <-

   data.frame(lapply(1:ncol(a1),function(i)setdiff(a1[,i],comparison$tM[,i])))

colnames(difference) <- colnames(a1)

difference

#  a b

#1 4 d

#2 5 e


查看完整回答
反对 回复 2019-07-31
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

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) 

anti_join(a1,a2)

而semi_join过滤行的a1,同时也是在a2


semi_join(a1,a2)


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 740 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信