【问题标题】:How to compare 3 data frames in R如何比较R中的3个数据框
【发布时间】:2015-09-14 19:15:24
【问题描述】:

我是 R 新手,但有一个问题,我似乎在网上的任何地方都找不到。

我想比较 3 个数据框,看看它们是否有相同的确切数据。如果他们没有,我希望输出告诉我哪些行的数据不匹配。我发现最接近的是使用两个数据集,将两者合并在一起,然后使用 dupsBetweenGroups 函数查找重复的行,但我找不到同时处理三个数据帧的答案..

这是我要比较的数据示例

数据帧A:

    Date    Time    pH
1   10/8    600     3.85
2   10/9    800     4.05
3   10/10   1300    3.95

数据帧B:

     Date    Time    pH
1    10/8    600     3.85
2    10/12   900     4.05
3    10/10   1300    3.95

数据帧C:

     Date    Time    pH
1    10/8    600     8.85
2    10/9    800     4.05
3    10/10   1300    3.95

如果输出可以根据 A、B 和 C 的行是否相同而返回 True 或 False,那将是完美的。

任何关于从哪里开始的指针或关于这个主题的任何好的阅读将不胜感激

【问题讨论】:

  • 取你用来合并前两个的代码。然后用同样的方法合并第三个。然后检查pH2 == pH & pH3 == pH。然后,如果您遇到问题,请发布代码,有人会帮助您。
  • 检查它们是否相同的快速方法是identical(DataFrameA, DataFrameB)。如果它们相同,您就完成了,如果它们不同,那么您可以寻找差异。

标签: r dataframe compare


【解决方案1】:

一种方法是比较成对的数据帧。总结来自this post 的几个选项。例如比较 df1 和 df2。

compare如果你需要TRUE或FALSE:

library(compare)
compare(df1, df2)

输出:

FALSE [FALSE, FALSE, TRUE]

Packagesqldf使用SQL:

library(sqldf)
# Different rows
sqldf('SELECT * FROM df1 EXCEPT SELECT * FROM df2')
  Date Time   pH
1 10/9  800 4.05
# Common rows
sqldf('SELECT * FROM df1 INTERSECT SELECT * FROM df2')
   Date Time   pH
1 10/10 1300 3.95
2  10/8  600 3.85

dplyr:

library(dplyr)
# Different rows
anti_join(df1,df2)
  Date Time   pH
    1 10/9  800 4.05
# Common rows
semi_join(df1, df2)
  Date Time   pH
1 10/10 1300 3.95
2  10/8  600 3.85

数据

df1 <- read.table(text="Date    Time    pH
                  1   10/8    600     3.85
                  2   10/9    800     4.05
                  3   10/10   1300    3.95", 
                  head=TRUE)    
df2 <- read.table(text="Date    Time    pH
                  1    10/8    600     3.85
                  2    10/12   900     4.05
                  3    10/10   1300    3.95", 
                  head=TRUE)    
df3 <- read.table(text="Date    Time    pH
                  1    10/8    600     8.85
                  2    10/9    800     4.05
                  3    10/10   1300    3.95", 
                  head=TRUE)

【讨论】:

    【解决方案2】:

    这可能不是最干净的方法,但应该可以:

    compare3row <- function(data1, data2, data3) {
      bool1 <- (all.equal(data1, data2) == TRUE) [1]
      bool2 <- (all.equal(data2, data3) == TRUE) [1]
      if(bool1 & bool2){
        return(TRUE)
      }
      else {
        return(FALSE)
      }
    }
    
    sapply(1:nrow(DataFrameA), function(n){compare3row(DataFrameA[n, ], DataFrameB[n, ],
                                                       DataFrameC[n, ])})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2016-10-27
      相关资源
      最近更新 更多