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

Wal*_*cio 42 database compare r dataset 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
Run Code Online (Sandbox Code Playgroud)

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

table(x == y, useNA = 'ifany')
Run Code Online (Sandbox Code Playgroud)

当数据集没有NA时,哪种方法很有用:

> table(df1 == df2, useNA = 'ifany')
TRUE 
  10 
Run Code Online (Sandbox Code Playgroud)

但是,当他们有NA时,不是那么多:

> table(df3 == df4, useNA = 'ifany')
TRUE <NA> 
  11    1 
Run Code Online (Sandbox Code Playgroud)

在这个例子中,很容易将其NA视为不是问题,因为我们知道两个数据帧都是相同的.问题在于NA == <anything>收益率NA,因此每当其中一个数据集有一个数据集时,无论另一个数据集NA在同一个位置上有什么关系,结果总是如此NA.

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

PS:注意这不是R的重复- 比较几个数据集,比较R中的2个数据集R中的比较数据集

The*_*Man 57

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

all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意,如果被比较的项目不相等,那么`all.equal`将*不*返回'FALSE`.相反,你必须使用`isTRUE(all.equal(df2,df1))`从`all.equal`得到一个`TRUE/FALSE`输出 (14认同)
  • dplyr :: all_equal()是另一种选择。默认情况下,它忽略列和行的顺序,并且对变量类敏感,但是那些默认值可以被忽略: (5认同)
  • @RicardoSaporta,你是对的,但在这种情况下,我认为最好继续使用`same()`,就像上面提到的@Metrics一样.关于`all.equal()`的事情是返回一个"描述目标和当前之间差异"的向量,这可能是好的还是坏的,这取决于你正在寻找什么样的输出. (2认同)

Wal*_*cio 25

正如Metrics所指出的那样,人们也可以identical()用来比较数据集.这种方法和其之间的差Codoremifaidentical()将刚产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)"   
Run Code Online (Sandbox Code Playgroud)

而且,从我测试的内容identical()来看,运行速度要快得多all.equal().