【问题标题】:Checking that all the columns with the same name, are equal in R?检查所有具有相同名称的列在 R 中是否相等?
【发布时间】:2015-03-16 08:58:57
【问题描述】:

假设我有两个数据框:

df1

row.names c1 c3 c6 c8 c9
r1 0 3 4 1 1
r2 1 4 5 7 3
r3 0 1 3 4 6

df2

row.names c1 c4 c6 c8 c9
r1 0 2 4 1 1
r2 1 5 5 7 3
r3 0 0 3 4 7

我想检查两个数据框中的那些列,同名,是否相等(因为它们的所有值都完全相同)?

在这种情况下,将检查 c1、c6、c8 和 c9,因为两个数据框都有这些列名 但是对于所有相等的值,只有 c1、c6、c8 为真,而 c9 为假(df1 中的 6 已更改为 df2 中的 7)?

如果它可以以某种方式指示具有相同列名的所有列是否相等,那将是一个很大的好处。因此,与其让每一列都为真,不如让一个整体为真?

我对 R 不太熟悉,所以不确定这个问题的可行性。任何帮助将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用mapply()。首先我们使用intersect() 来查找匹配的列名,然后在每一列上运行identical()

    i <- intersect(names(df1), names(df2))
    mapply(identical, df1[i], df2[i])
    #   c1    c6    c8    c9 
    # TRUE  TRUE  TRUE FALSE 
    

    在哪里

    df1 <- read.table(text = "c1 c3 c6 c8 c9
     r1 0 3 4 1 1
     r2 1 4 5 7 3
     r3 0 1 3 4 6", header = TRUE)
    df2 <- read.table(text = "c1 c4 c6 c8 c9
     r1 0 2 4 1 1
     r2 1 5 5 7 3
     r3 0 0 3 4 7", header = TRUE)
    

    【讨论】:

      【解决方案2】:

      另一个选项是 all.equal:

      i <- intersect(names(df1), names(df2))
      all.equal(df1[i], df2[i])
      [1] "Component “c9”: Mean relative difference: 0.1666667"
      

      因此,在这种情况下,并非 c9 列中的所有值都相同。

      【讨论】:

        猜你喜欢
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 2018-11-10
        相关资源
        最近更新 更多