【问题标题】:Checking equality of elements in 2 dataframes in R column by column逐列检查R中2个数据帧中元素的相等性
【发布时间】:2017-06-07 14:13:31
【问题描述】:

我正在尝试使用all.equal 函数逐列检查 R 中两个数据帧的元素是否相等,我想使用 for 循环来执行此操作。我是 R 新手,所以我不确定如何编写一个包含两个数据帧的 for 循环。

感谢任何帮助。

【问题讨论】:

    标签: r for-loop dataframe equality


    【解决方案1】:

    我注意到这个问题没有得到回答,所以我想我会记下一个答案以供将来参考。

    为了提供一个工作示例,我将使用 R 附带的 mtcars 数据集作为 datasets 包的一部分。

    首先,让我们创建一个虚拟数据集来与 mtcars 进行比较。让我们将此数据集称为 mtcars2 并让第 5 列和第 11 列,dratcarb 分别与原来的 mtcars 对应部分有所不同,同时保持第 1 到 4 列和第 6 到 10 列不变。为了“弄乱”第 5 列和第 11 列,我们将结合使用 jitter() 和简单的乘法。

    mtcars2 <- as.data.frame(cbind(mtcars[, 1:4], "drat" = jitter(mtcars[,5]) * 4,
                                   mtcars[,6:10], "carb" = jitter(mtcars[,11])* 0.5))
    

    所以现在我们有一个虚拟数据集可以在我们的 for 循环中与 mtcars 进行比较。接下来我们准备一个 data.frame 来写入我们的 for 循环的结果。我们需要一个data.frame,它的行数等于我们要比较的列数,我们需要两列,一列col_number 来显示对应的all.equal() 结果指的是哪一列。然后,当然,我们需要另一列AE_result 来存储我们将要调用的all_equal() 函数的结果。我们将此 data.frame 称为 df_AE 并将 col_number 声明为数字向量,并将 AE_result 声明为字符向量。

    width <- ncol(mtcars)
    df_AE <- as.data.frame(matrix(0L, nrow = width, ncol = 2))
    
    names(df_AE) <- c("col_number", "AE_result")
    class(df_AE$col_number) <- "numeric"
    class(df_AE$AE_result) <- "character" 
    

    所以现在我们准备好实际的for循环了,我们将在列中计数,在每对列上调用all.equal,并编写计数器(@ 987654339@) 和结果 (x) 到我们的df_AE data.frame。

    for (i in 1:width) {
        x <- all.equal(mtcars[, i], mtcars2[, i])
        df_AE[i,1] <- i
        df_AE[i,2] <- x
    }
    

    所以现在当我们调用df_AE 时,我们会得到如下信息:

    df_AE
    
    > df_AE
           col_number                           AE_result
    1           1                                TRUE
    2           2                                TRUE
    3           3                                TRUE
    4           4                                TRUE
    5           5  Mean relative difference: 3.000102
    6           6                                TRUE
    7           7                                TRUE
    8           8                                TRUE
    9           9                                TRUE
    10         10                                TRUE
    11         11 Mean relative difference: 0.4982218
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多