按列查找两个数据框之间的差异不起作用
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 行。
我在新数据和旧数据数据框中有两个大型数据集,其中 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 行。