按不同的因子级别过滤不同的组

时间:2019-08-16 11:57:48

标签: r dplyr tibble

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

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))

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

2 个答案:

答案 0 :(得分:4)

使用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. 我觉得这种方法太手工了。也许有更好的方法。

答案 1 :(得分:1)

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

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