【问题标题】:Delete rows from a data frame in R based on column values in another data frame根据另一个数据框中的列值从 R 中的数据框中删除行
【发布时间】:2020-11-13 19:10:02
【问题描述】:

我有两个数据框如下:

df1 <- data.frame(fruit=c("apple", "blackberry", "orange", "pear", "grape"), 
color=c("black", "purple", "blue", "green", "red"), 
quantity1=c(1120, 7600, 21409, 120498, 25345), 
quantity2=c(1200, 7898, 21500, 140985, 27098), 
taste=c("sweet", "bitter", "sour", "salty", "spicy"))

df2 <- data.frame(fruit=c("apple", "orange", "pear"), 
color=c("black", "yellow", "green"), 
quantity=c(1145, 65094, 120500))

我想根据 df2 中的行删除 df1 中的行,它们必须符合所有 3 个条件:

  1. 水果名称必须匹配
  2. 颜色必须匹配
  3. df2 中的数量必须介于 df1 中的两个数量之间

我的示例的输出应如下所示:

df3 <- data.frame(fruit=c("blackberry", "orange", "grape"), 
color=c("purple", "blue", "red"), 
quantity1=c(7600, 21409, 25345), 
quantity2=c(21500, 7898, 27098), 
taste=c("bitter", "sour", "spicy"))

【问题讨论】:

    标签: r filter match


    【解决方案1】:

    我想知道tidyverse是否也可以使用:

    library(tidyverse)
    df1 %>%
      left_join(df2, by = c("fruit", "color")) %>%
      filter(is.na(quantity) | quantity <= quantity1 | quantity >= quantity2)
      
    #>        fruit  color quantity1 quantity2  taste quantity
    #> 1 blackberry purple      7600      7898 bitter       NA
    #> 2     orange   blue     21409     21500   sour       NA
    #> 3      grape    red     25345     27098  spicy       NA
    

    【讨论】:

      【解决方案2】:

      使用data.table,我们可以使用非等连接

      library(data.table)
      setDT(df1)[!df2, on = .(fruit, color, quantity1 <= quantity,
                 quantity2 >= quantity)]
      #        fruit  color quantity1 quantity2  taste
      #1: blackberry purple      7600      7898 bitter
      #2:     orange   blue     21409     21500   sour
      #3:      grape    red     25345     27098  spicy
      

      或者使用与fuzzy_anti_join 相同的方法,如this 帖子中所示

      【讨论】:

        【解决方案3】:

        您可以使用来自fuzzyjoin 包的fuzzy_anti_join

        fuzzyjoin::fuzzy_anti_join(df1, df2, 
             by = c('fruit', 'color','quantity1' = 'quantity', 'quantity2' = 'quantity'), 
             match_fun = list(`==`, `==`, `<=`, `>=`))
        
        # A tibble: 3 x 5
        #  fruit      color  quantity1 quantity2 taste 
        #  <chr>      <chr>      <dbl>     <dbl> <chr> 
        #1 blackberry purple      7600      7898 bitter
        #2 orange     blue       21409     21500 sour  
        #3 grape      red        25345     27098 spicy 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 2018-06-22
          相关资源
          最近更新 更多