按不同的因素水平过滤不同的组

Filter different groups by different factor levels

我有一个如下所示的数据框。

set.seed(5)
df <- tibble(x=factor(rep(c(LETTERS,letters[1:12]),10)), y=sample(seq(1993,2000), 380, replace = T),z = sample(1:12, 380, replace = T))

是否有一种简单的方法来过滤此数据框以保持 y>=1993 级别 A,y>=1994 级别 B,y>=1995 级别 C,y>=1996 D级,y>=1997级E,y>=1993级F,y>=1994级G,y>=1995级a和其余级别y>=2000列x 使用 dplyr 个动词?

您可以使用带括号的布尔值来完成此操作:

library(dplyr)

df %>%
  filter((x == "A" & y >= 1993) | (x == "B" & y >= 1994) | (x == "C" & y >= 1995))

  x         y     z
  <fct> <dbl> <int>
1 A      1993     2
2 A      1994     3
3 A      1995     4
4 B      1994     7
5 B      1995     8
6 C      1995    12

dplyr:

df %>% 
 filter(ifelse(x=="A",y>=1993,ifelse(x=="B",
                                      y>=1994,y>=1995)))
# A tibble: 6 x 3
  x         y     z
  <fct> <dbl> <int>
1 A      1993     2
2 A      1994     3
3 A      1995     4
4 B      1994     7
5 B      1995     8
6 C      1995    12

或使用case_when:

df %>% 
   filter(case_when(x=="A" ~ y>=1993,
                    x=="B" ~ y>=1994,
                   TRUE ~ y>=1995))
# A tibble: 6 x 3
  x         y     z
  <fct> <dbl> <int>
1 A      1993     2
2 A      1994     3
3 A      1995     4
4 B      1994     7
5 B      1995     8
6 C      1995    12

编辑:使用更新后的数据和条件:

    set.seed(520)

   df %>% 
     filter(case_when(x %in% c("A","F") ~ y>=1993,
                     x %in% c("C","a") ~ y>=1995,
                      x=="D" ~ y>=1996,
                      x=="G"~ y>=1994,
                      x=="E" ~ y>= 1997,
                      TRUE ~ y>=2000))
    # A tibble: 90 x 3
       x         y     z
       <fct> <int> <int>
     1 A      1999     3
     2 C      1998     5
     3 F      1993     8
     4 G      1997     7
     5 H      2000     5
     6 K      2000     2
     7 P      2000     2
     8 V      2000     9
     9 W      2000     1
    10 g      2000     7
    # … with 80 more rows

注释::

  1. 数据:种子设置为 520

  2. 我觉得这种方法有点太手动了。可能有更好的方法。