我正在尝试使用all.equal
函数逐列检查R中两个数据帧的元素是否相等,我想使用for循环来执行此操作。我是R的新手所以我不确定如何编写包含两个数据帧的for循环。
感谢任何帮助。
答案 0 :(得分:0)
我注意到这个问题没有得到解答,所以我想我会给出答案以供将来参考。
为了提供一个工作示例,我将使用R附带的mtcars
数据集作为datasets
包的一部分。
首先,让我们创建一个虚拟数据集来与mtcars进行比较。让我们调用此数据集mtcars2
,让我们分别创建第5列和第11列,drat
和carb
,在某种程度上与原始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