77

假设我在 R 中有大型数据集,我只想知道其中两个是否相同。当我尝试不同的算法以达到相同的结果时,我经常使用它。例如,假设我们有以下数据集:

df1 <- data.frame(num = 1:5, let = letters[1:5])
df2 <- df1
df3 <- data.frame(num = c(1:5, NA), let = letters[1:6])
df4 <- df3

所以这就是我用来比较它们的方法:

table(x == y, useNA = 'ifany')

当数据集没有 NA 时效果很好:

> table(df1 == df2, useNA = 'ifany')
TRUE 
  10 

但当他们有 NA 时就不那么重要了:

> table(df3 == df4, useNA = 'ifany')
TRUE <NA> 
  11    1 

在示例中,很容易将其NA视为不是问题,因为我们知道两个数据帧相等的。问题是NA == <anything>产生NA,所以只要其中一个数据集有NA,不管另一个数据集在同一位置有什么,结果总是NA

因此,table()用于比较数据集对我来说似乎并不理想。如何更好地检查两个数据帧是否相同?

PS:注意这不是R 的副本 - 比较几个数据集比较 R 中的 2 个数据集比较 R中的数据集

4

2 回答 2

95

查找 all.equal。它有一些骑手,但它可能对你有用。

all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
于 2013-10-01T14:51:33.683 回答
37

正如Metrics所指出的,人们也可以identical()用来比较数据集。这种方法与Codoremifa方法之间的区别在于,它identical()只会产生TRUEFALSE这取决于被比较的对象是否相同,而all.equal()将返回TRUE或提示对象之间的差异。例如,考虑以下情况:

> identical(df1, df3)
[1] FALSE

> all.equal(df1, df3)
[1] "Attributes: < Component 2: Numeric: lengths (5, 6) differ >"                                
[2] "Component 1: Numeric: lengths (5, 6) differ"                                                
[3] "Component 2: Lengths: 5, 6"                                                                 
[4] "Component 2: Attributes: < Component 2: Lengths (5, 6) differ (string compare on first 5) >"
[5] "Component 2: Lengths (5, 6) differ (string compare on first 5)"   

此外,从我测试的结果identical()来看,它的运行速度似乎比all.equal().

于 2013-10-01T18:05:07.543 回答