【问题标题】:How to check if two data frames are equal [duplicate]如何检查两个数据帧是否相等[重复]
【发布时间】:2013-10-07 19:09:00
【问题描述】:

假设我在 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 == &lt;anything&gt; 产生NA,所以只要其中一个数据集有一个NA,另一个在同一位置有什么并不重要,结果总是NA

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

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

【问题讨论】:

  • identical(df1,df2)
  • @Frank,我相信解决方案很常见,问题也大致相同(我们先不讨论矩阵和数据框之间差异的语义)。但是,为了帮助将来的搜索,我认为应该保留两个 Q。顺便说一句,您的链接针对同一页面,这是另一个问题的 URL:stackoverflow.com/questions/11767851/…
  • 是的,我的意思是我们可以将其标记为欺骗,只是因为它来得较晚。你有答案,所以我想你不会介意的。如果您同意,您可以将其标记为受骗关闭,或者我可以开始投票。 (没有一个开始。)
  • @Frank:好吧,我会做的。现在是harakiri时间!
  • dplyr::all_equal() 具有忽略列和行顺序以及将类从因子转换为字符以及将整数转换为双精度的参数。

标签: database r dataset compare dataframe


【解决方案1】:

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

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

【讨论】:

  • 我刚刚了解了这个功能,并将进一步测试它是否真的适用于这个特定的任务,但到目前为止,一切都很好。谢谢!
  • 需要注意的是,如果被比较的项目不相等,那么all.equal返回FALSE。相反,您必须使用isTRUE( all.equal(df2,df1) )all.equal 获取TRUE/FALSE 输出
  • @RicardoSaporta,你是对的,但在这种情况下,我认为最好继续使用identical(),正如上面@Metrics 所建议的那样。关于all.equal() 的事情是返回一个向量“描述目标和当前之间的差异”,这可能是好是坏取决于你正在寻找什么样的输出。
  • dplyr::all_equal() 是另一种选择。默认情况下,它忽略列和行顺序,并且对变量类敏感,但可以覆盖这些默认值:dplyr::all_equal(target, current, ignore_col_order = FALSE, ignore_row_order = FALSE, convert = TRUE)
  • 对于我的两个大数据框,identical(df2,df1) 返回FALSE,但isTRUE(all.equal(df2,df1)) 返回TRUE(还有all_equal())。知道为什么吗?
【解决方案2】:

正如Metrics 指出的那样,也可以使用identical() 来比较数据集。这种方法与Codoremifa 的区别在于identical() 将只产生FALSETRUE,这取决于被比较的对象是否相同,而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() 快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2020-11-27
    • 2012-03-26
    • 2011-03-08
    • 2020-02-12
    相关资源
    最近更新 更多