【问题标题】:Subsetting a data frame to the rows not appearing in another data frame将数据框设置为未出现在另一个数据框中的行
【发布时间】:2016-03-05 04:15:31
【问题描述】:

我有一个带有观察结果的数据框 A

    Var1   Var2  Var3
     1       3    4
     2       5    6
     4       5    7
     4       5    8
     6       7    9

和带有观察的数据框 B

    Var1   Var2  Var3
     1       3    4
     2       5    6

它基本上是 A 的一个子集。 现在我想选择A中的观察而不是B中的观察,即带有观察的数据框C

    Var1   Var2  Var3
     4       5    7
     4       5    8
     6       7    9

有没有办法在 R 中做到这一点?我使用的数据框只是任意数据。

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    dplyr 有一个很好的 anti_join 函数可以做到这一点:

    > library(dplyr)
    > anti_join(A, B)
    Joining by: c("Var1", "Var2", "Var3")
      Var1 Var2 Var3
    1    6    7    9
    2    4    5    8
    3    4    5    7
    

    【讨论】:

      【解决方案2】:

      使用 sqldf 是一种选择。

      require(sqldf)
      
      C <- sqldf('SELECT * FROM A EXCEPT SELECT * FROM B')
      

      【讨论】:

      • 你应该先安装“sqldf”:install.packages("sqldf")
      【解决方案3】:

      一种方法是将AB 的所有列粘贴在一起,限制为A 中的行,其粘贴的表示未出现在B 的粘贴表示中:

      A[!(do.call(paste, A) %in% do.call(paste, B)),]
      #   Var1 Var2 Var3
      # 3    4    5    7
      # 4    4    5    8
      # 5    6    7    9
      

      这种方法的一个明显缺点是它假定具有相同粘贴表示的两行实际上是相同的。这是一种稍微笨拙的方法,但没有此限制:

      combined <- rbind(B, A)
      combined[!duplicated(combined) & seq_len(nrow(combined)) > length(B),]
      #   Var1 Var2 Var3
      # 5    4    5    7
      # 6    4    5    8
      # 7    6    7    9
      

      基本上我使用rbindA 附加到B 下方,然后限制为既不重复也不最初来自B 的行。

      【讨论】:

        【解决方案4】:

        另一种选择:

        C <- rbind(A, B)
        C[!(duplicated(C) | duplicated(C, fromLast = TRUE)), ]
        

        输出:

          Var1 Var2 Var3
        3    4    5    7
        4    4    5    8
        5    6    7    9
        

        【讨论】:

          【解决方案5】:

          使用,您可以按如下方式进行反连接:

          library(data.table)
          setDT(df1)[!df2, on = names(df1)]
          

          它给出了预期的结果:

             Var1 Var2 Var3
          1:    4    5    7
          2:    4    5    8
          3:    6    7    9
          

          【讨论】:

            猜你喜欢
            • 2013-07-23
            • 2023-02-17
            • 2013-06-29
            • 1970-01-01
            • 2021-10-14
            • 1970-01-01
            • 1970-01-01
            • 2017-02-12
            • 1970-01-01
            相关资源
            最近更新 更多