【问题标题】:dplyr filter on value only if another value exists in the group in the same column仅当同一列的组中存在另一个值时,dplyr 才过滤值
【发布时间】:2019-02-03 19:37:07
【问题描述】:

我完全预料到会因为重复的问题而受到抨击,但我就是找不到类似的问题。提前道歉。

我正在尝试清理一些有时包含摘要行但有时不包含的数据。这是一个可重复的小例子:

library(tidyverse)

yr <- c(2010, 2010, 2010,
        2011, 2011, 2011, 2011,
        2012, 2012, 2012)

a <- c("HAY", "APPLES", "PUMPKINS",
       "HAY", "HAY & HAYLAGE", "APPLES", "PUMPKINS",
       "HAY & HAYLAGE", "APPLES", "PUMPKINS")

b <- c(1:10)

dat <- as_tibble(list(yr = yr, a = a, b = b))

dat %>% 
  group_by(yr) %>% 
  filter(a != "HAY" if group contains a== "HAY & HAYLAGE")

显然,最后一行代码是伪代码。在 yr = 2011 的组中,我想过滤掉 a 等于“HAY”的行。我生成的小标题应该有 9 行。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一种方法——您可以在过滤条件中使用if 语句:

    library(dplyr) 
    
    # (data from OP) 
    dat <- dplyr::tibble(
      yr = c(2010, 2010, 2010, 2011, 2011, 
             2011, 2011, 2012, 2012, 2012),
      a = c("HAY", "APPLES", "PUMPKINS", "HAY", "HAY & HAYLAGE", 
            "APPLES", "PUMPKINS", "HAY & HAYLAGE", "APPLES", "PUMPKINS"), 
      b = 1:10
    )
    
    
    dat %>% 
      group_by(yr) %>% 
      filter(if ('HAY & HAYLAGE' %in% a) a!='HAY' else TRUE) %>% 
      ungroup()
    
    ## result will be: 
    ## 
    ## # A tibble: 9 x 3
    ##      yr a                 b
    ##   <dbl> <chr>         <int>
    ## 1  2010 HAY               1
    ## 2  2010 APPLES            2
    ## 3  2010 PUMPKINS          3
    ## 4  2011 HAY & HAYLAGE     5
    ## 5  2011 APPLES            6
    ## 6  2011 PUMPKINS          7
    ## 7  2012 HAY & HAYLAGE     8
    ## 8  2012 APPLES            9
    ## 9  2012 PUMPKINS         10
    

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多