【问题标题】:Compare if two dataframe objects in R are equal?比较 R 中的两个数据框对象是否相等?
【发布时间】:2012-05-14 22:59:53
【问题描述】:

如何检查两个对象,例如数据帧,R中的值是否相等?

值相等,我的意思是一个数据帧的每一列的每一行的值等于第二个数据帧中相应行和列的值。

【问题讨论】:

  • ?all.equal?identical?如果不是这两个,那么您将不得不扩展您的问题,以便我们知道您到底想要比较什么。
  • 看看HERE
  • “价值相等”是什么意思
  • 我投票决定关闭,因为它在当前状态下无法回答。

标签: r dataframe compare equality


【解决方案1】:

不清楚测试两个数据帧是否“值相等”是什么意思,但测试值是否相同,这里是两个值相等的不同数据帧的示例:

a <- data.frame(x = 1:10)
b <- data.frame(y = 1:10)

测试所有值是否相等:

all(a == b) # TRUE

测试对象是否相同(它们不一样,它们有不同的列名):

identical(a,b) # FALSE: class, colnames, rownames must all match.

【讨论】:

  • 如果有人感到困惑,它们并不相同,因为列名不同。
  • @joran 感谢您指出这一点,我已经澄清了我的答案。
  • 请注意,identical 要返回 true,不仅值和列名必须匹配,行号/名称也必须匹配。 (这在使用子集()时击中了我;原来all 是我想要的。)
  • @DavidLeBauer 有没有办法让相同的忽略订单?
  • @user4050 的顺序是什么?值的顺序?你可以像identical(sort(a), sort(b))一样对这两个向量进行排序。
【解决方案2】:

另外,相同还是有用的,支持实际目标:

identical(a[, "x"], b[, "y"]) # TRUE

【讨论】:

    【解决方案3】:

    我们可以使用R包compare来测试对象的名称和值是否相同,只需一步。

    a <- data.frame(x = 1:10)
    b <- data.frame(y = 1:10)
    
    library(compare)
    compare(a, b)
    #FALSE [TRUE]#objects are not identical (different names), but values are the same.
    

    如果我们只关心值的相等性,我们可以设置ignoreNames=TRUE

    compare(a, b, ignoreNames=T)
    #TRUE
    #  dropped names
    

    该包还有compareEqualcompareIdentical等其他有趣的功能。

    【讨论】:

      【解决方案4】:

      不需要依赖另一个包,而是比较两个数据集的结构(类和属性):

      structure_df1 <- sapply(df1, function(x) paste(class(x), attributes(x), collapse = ""))
      structure_df2 <- sapply(df2, function(x) paste(class(x), attributes(x), collapse = ""))
      
      all(structure_df1 == structure_df2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多