如何检查两个数据帧是否相等

时间:2013-10-01 14:48:05

标签: database r dataset compare dataframe

假设我在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 

但是当他们有NAs时却没那么多:

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

在示例中,很容易将NA视为不是问题,因为我们知道两个数据帧 相等。问题是NA == <anything>会产生NA,所以每当其中一个数据集有一个NA时,另一个数据集在同一个位置上的含义并不重要,结果总会如此成为NA

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

P.S。:请注意,这不是R - comparing several datasetsComparing 2 datasets in RCompare datasets in R

的副本

2 个答案:

答案 0 :(得分:54)

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

all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE

答案 1 :(得分:23)

正如Metrics所指出的那样,人们也可以使用identical()来比较数据集。这种方法与Codoremifa的方法之间的区别在于identical()只会产生TRUE FALSE,这取决于被比较的对象是否相同,而{{1}将返回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()跑得快。