繁体   English   中英

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

[英]Finding difference between two dataframes by a column is not working

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

现在,我正在尝试将 label 归入所有 3 个类别,即普通、新旧和旧,虽然新和普通工作正常,但我在旧的方面并没有那么成功。 不知道我错过了什么,任何指针将不胜感激

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"   

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

使用@r2evans 的数据:

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

我们可以运行:

library(waldo)
compare(dat1, dat2)

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

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM