逐列检查R中2个数据帧中元素的相等性

时间:2017-01-23 05:59:08

标签: r for-loop dataframe equality

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我注意到这个问题没有得到解答,所以我想我会给出答案以供将来参考。

为了提供一个工作示例,我将使用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,然后编写计数器(i)和结果(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