【问题标题】:Removing data from one dataframe that exists in another dataframe R从另一个数据帧R中存在的一个数据帧中删除数据
【发布时间】:2020-04-30 22:04:12
【问题描述】:

我想从另一个数据框中的数据框中删除数据。举个例子吧:

letters<-c('a','b','c','d','e')
numbers<-c(1,2,3,4,5)
list_one<-data.frame(letters,numbers)

我想删除 list_one 中与其他数据框的字母匹配的每一行:

letters2<-c('a','c','d')
list_two<-data.frame(letters2)

我应该提一下,我实际上是在尝试使用两个大型 csv 文件来执行此操作,所以我真的不能使用否定表达式 - 取出行。

并创建一个最终数据框,其中只有字母 b 和 e 及其对应的数字。我该怎么做呢?

我是 R 新手,所以当我不太确定要搜索哪些关键术语时,很难研究问题。任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 仅供参考,letters 实际上是一个常量/内置向量,LETTERS 也是如此

标签: r


【解决方案1】:

dplyr 解决方案

library(dplyr)

list_one %>% anti_join(list_two)

【讨论】:

    【解决方案2】:

    基础 R 解决方案

    list_one[!list_one$letters %in% list_two$letters2,]
    

    给你:

      letters numbers
    2       b       2
    5       e       5
    

    解释:

    > list_one$letters %in% list_two$letters2
    [1]  TRUE FALSE  TRUE  TRUE FALSE
    

    这为您提供了一个 LENGTH == length(list_one$letters) 向量,其值为 TRUE/FALSE。 ! 否定这个向量。因此,如果 list_two$letters2 中存在该值,您最终会得到 FALSE/TRUE 值。

    如果您对如何从 data.frame 中选择行有疑问,请输入

    ?`[.data.frame`
    

    到控制台并阅读它。

    【讨论】:

      【解决方案3】:

      答案是对您的编辑的回应: "所以我真的不能用否定词"。

      我想最有效的方法之一是使用data.table,如下所示:

      require(data.table)
      setDT(list_one)
      setDT(list_two)
      list_one[!list_two, on=c(letters = "letters2")]
      

      或者

      require(data.table)
      setDT(list_one, key = "letters")
      setDT(list_two, key = "letters2")
      list_one[!letters2]
      

      (感谢 Frank 的改进)

      结果:

         letters numbers
      1:       b       2
      2:       e       5
      

      首先查看?"data.table"Quickly reading very large tables as dataframes in R,了解为什么要使用data.table::fread 来读取csv 文件。

      顺便说一句:如果你有 letters2 而不是 list_two 你可以使用

      list_one[!J(letters2)]
      

      【讨论】:

        猜你喜欢
        • 2017-11-16
        • 2021-04-26
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 2022-10-25
        • 1970-01-01
        相关资源
        最近更新 更多