【问题标题】:Compare two tables比较两个表
【发布时间】:2021-06-22 07:55:43
【问题描述】:

比较数据帧的最简单和最快的方法是什么。 输入:

df1 <- data.frame(ID = c(1, 2, 3, 4),
                  A = c(1, 2, 3, NA),
                  B = c(1, 2, NA, NA))
> df1
  ID  A  B
1  1  1  1
2  2  2  2
3  3  3 NA
4  4 NA NA

df2 <- data.frame(ID = c(1, 2, 3, 4),
                  A = c(1, 2, 3, 4),
                  B = c(1, 2, 3, NA))
> df2
  ID A  B
1  1 1  1
2  2 2  2
3  3 3  3
4  4 4 NA

我假设数据框具有相同数量的行和列。 输出数据框应包含:

  1. 具有来自 df1 或 df2 的值的列 ID -(如果来自 df1 或 df2 则不适用,因为它们是相同的。
  2. 如果 df1 中的单元格内容与 df2 中的不同,则 A 列和 B 列中的值应为 df2 中的值,如果值相同,则应为 NA。

我可以为每一行和每一列使用和迭代,但这不是优雅的解决方案。 好点了吗?

我试过了:

result = apply(ifelse(df1[,] == df2[,], NA, df2[,])

但不起作用。

输出 df 应如下所示:

result <- data.frame(ID = c(1, 2, 3, 4),
                  A = c(NA, NA, NA, 4),
                  B = c(NA, NA, 3, NA)) 

> result
  ID  A  B
1  1 NA NA
2  2 NA NA
3  3 NA  3
4  4  4 NA

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    您可以使用== 进行比较,并在df2 中使用NA 覆盖匹配项:

    df2[-1][df1[-1] == df2[-1]] <- NA
    df2
    #  ID  A  B
    #1  1 NA NA
    #2  2 NA NA
    #3  3 NA  3
    #4  4  4 NA
    

    【讨论】:

    • 感谢您的快速响应。我什至认为这个解决方案会如此简单。我假设 -1 说排除第一列。如果会有第二列 ID2,它也应该总是像列 ID 这样的值,如何做到这一点?
    • 要排除前两列使用df1[-1:-2],或仅使用第二列df[-2]
    猜你喜欢
    • 2018-02-25
    • 2012-03-01
    • 2013-03-27
    • 2012-06-21
    • 2011-06-19
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多