【问题标题】:Create a new dataframe according to the contrast between two similar df [duplicate]根据两个相似的df [重复]之间的对比创建一个新的数据框
【发布时间】:2018-02-19 13:11:21
【问题描述】:

我有一个这样的数据框:

  X Y  Z T
  1 2  4 2
  3 2  1 4
  7 5 NA 3

经过几个步骤(不重要是哪一个)我得到了这个df:

  X Y Z T
  1 2 4 2
  3 2 NA 4
  7 5 NA 3

我想获得一个仅由 在步骤中没有改变的行组成的新数据框;结果将是这个:

 X  Y  Z  T
 1  2  4  2
 7  5  NA 3

我该怎么办?

【问题讨论】:

  • 只是一个 merge 不是吗 - merge(dt1,dt2)
  • @zx8754 这可能不是重复的,因为连接可能不是正确的答案,具体取决于数据的结构。
  • @ira 基于提供的示例数据和预期输出,所有列中它都是一个简单的merge,上面由 thelatemail 指出。
  • @zx8754 这个例子可能会被简化。这行i want to obtain a new dataframe made by only the rows which didn't change during the steps; 似乎没有请求加入结果。
  • @zx8754 不,合并没有给我预期的结果。 Akrun 给了我解决方案

标签: r dataframe compare-contrast


【解决方案1】:

base R 的一个选项是将 paste 将每个数据集的行放在一起并比较 (==) 以创建一个逻辑向量,我们将其用于新数据集的子集

dfO[do.call(paste, dfO) == do.call(paste, df),]
#   X Y  Z T
#1 1 2  4 2
#3 7 5 NA 3

其中“dfO”是旧数据集,“df”是新数据集

【讨论】:

    【解决方案2】:

    你可以使用dplyr的intersect函数:

    library(dplyr)
    intersect(d1, d2)
    #  X Y  Z T
    #1 1 2  4 2
    #2 7 5 NA 3
    

    这是基本 R 的 intersect 函数的 data.frame 等效项。

    如果您使用的是data.tables,该软件包也提供了这样的功能:

    library(data.table)
    setDT(d1)
    setDT(d2)
    fintersect(d1, d2)
    #   X Y  Z T
    #1: 1 2  4 2
    #2: 7 5 NA 3
    

    【讨论】:

      【解决方案3】:

      另一个dplyr 解决方案:semi_join

      dt1 %>% semi_join(dt2, by = colnames(.))
        X Y  Z T
      1 1 2  4 2
      2 7 5 NA 3
      

      数据

      dt1 <- read.table(text = "X Y  Z T
        1 2  4 2
        3 2  1 4
        7 5 NA 3",
                        header = TRUE, stringsAsFactors = FALSE)
      
      dt2 <- read.table(text = "  X Y Z T
        1 2 4 2
                        3 2 NA 4
                        7 5 NA 3",
                        header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

        【解决方案4】:

        恐怕semi joinintersectmerge 都不是正确答案。 mergeintersect 将无法正确处理重复行。 semi join 将改变行的顺序。

        从这个角度来看,我认为目前为止唯一正确的是akrun的。

        你也可以这样做:

        df1[rowSums(((df1 == df2) | (is.na(df1) & is.na(df2))), na.rm = T) == ncol(df1),]
        

        但我认为 akrun 的方式更优雅,在速度方面可能表现更好。

        【讨论】:

        • 话虽如此,如果您没有重复的行或者您不关心行的顺序...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2020-11-13
        • 2018-04-10
        • 1970-01-01
        • 2019-06-07
        相关资源
        最近更新 更多