按列查找两个数据框之间的差异不起作用

Finding difference between two dataframes by a column is not working

我在新数据和旧数据数据框中有两个大型数据集,其中 ID 作为主列键和 30 个其他列。 虽然大多数 ID 在新旧之间是通用的,但很少有旧 ID 被删除且不存在于新 ID 中,反之亦然,新 ID 被添加到新旧中,而旧 ID 中不存在。

现在,我正在尝试为所有 3 个类别添加标签,如 Common、New 和 Old,虽然 New 和 Common 工作正常,但我在 Old 上并没有取得太大的成功。不确定我遗漏了什么,如有任何指点,我们将不胜感激

commonIDs<-data.frame(intersect(old_data$IDs,new_data$IDs))

#New Ids
added <- NULL
added <- new_data[!new_data$IDs %in% commonIDs$IDs,]
added <- data.frame(Remarks ="New", added)


#Deleted IDs
deleted <- NULL
deleted <- old_data[!old_data$IDs %in% commonIDs$IDs,]

我也试过另一种方法,但还是不行

new <- data.frame(new_data[is.na(match(new_data$IDs,commonIDs$IDs)),])
old <- data.frame(old_data[is.na(match(old_data$IDs,commonIDs$IDs)),])

起始数据:

dat <- data.frame(id = 1:10)
dat1 <- dat[-(3:4),,drop=FALSE]
dat2 <- dat[-(6:10),,drop=FALSE]

全连接操作:

merged <- merge(transform(dat1, dat1=T), transform(dat2, dat2=T), by = "id", all = TRUE)
merged
#    id dat1 dat2
# 1   1 TRUE TRUE
# 2   2 TRUE TRUE
# 3   3   NA TRUE
# 4   4   NA TRUE
# 5   5 TRUE TRUE
# 6   6 TRUE   NA
# 7   7 TRUE   NA
# 8   8 TRUE   NA
# 9   9 TRUE   NA
# 10 10 TRUE   NA

所以我们可以轻松地:

with(merged, ifelse(is.na(dat1), "In2", ifelse(is.na(dat2), "In1", "Common")))
#  [1] "Common" "Common" "In2"    "In2"    "Common" "In1"    "In1"    "In1"    "In1"    "In1"   

您也可以考虑尝试围绕此用例开发的软件包。

使用@r2evans 的数据:

dat <- data.frame(id = 1:10)
dat1 <- dat[-(3:4),,drop=FALSE]
dat2 <- dat[-(6:10),,drop=FALSE]

我们可以运行:

library(waldo)
compare(dat1, dat2)

并获得此输出(粘贴为图片以保留颜色格式),这表明 dat1 缺少第 3-4 行的数据和行名,而 dat2 缺少那些第 6-10 行。