亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較兩個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 關注
  • 785 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號