【发布时间】:2017-06-07 14:13:31
【问题描述】:
我正在尝试使用all.equal 函数逐列检查 R 中两个数据帧的元素是否相等,我想使用 for 循环来执行此操作。我是 R 新手,所以我不确定如何编写一个包含两个数据帧的 for 循环。
感谢任何帮助。
【问题讨论】:
标签: r for-loop dataframe equality
我正在尝试使用all.equal 函数逐列检查 R 中两个数据帧的元素是否相等,我想使用 for 循环来执行此操作。我是 R 新手,所以我不确定如何编写一个包含两个数据帧的 for 循环。
感谢任何帮助。
【问题讨论】:
标签: r for-loop dataframe equality
我注意到这个问题没有得到回答,所以我想我会记下一个答案以供将来参考。
为了提供一个工作示例,我将使用 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,并编写计数器(@ 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
【讨论】: