【问题标题】:Finding difference between two dataframes by a column is not working按列查找两个数据框之间的差异不起作用
【发布时间】:2021-04-28 18:58:48
【问题描述】:

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

现在,我正在尝试将所有 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)),])

【问题讨论】:

  • 你的代码看起来不错——你能让你的例子重现吗?你有多确定它不起作用?也许您实际上没有任何旧 ID,这些旧 ID 不存在于 new_data 中。
  • 附带说明,added &lt;- NULLdeleted &lt;- NULL 不做任何事情 - 您可以删除这些行。
  • 快速查看已删除 ID 的方法是 setdiff(old_data$IDs, new_data$IDs)。如果这给出了character(0)numeric(0)(或任何你的ID 类),那么来自old_data 的所有ID 都在new_data 中。

标签: r dataframe compare comparison


【解决方案1】:

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

使用@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 行的数据和行名。

【讨论】:

    【解决方案2】:

    起始数据:

    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"   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多