R 按不同的因子水平筛选不同的组

R 按不同的因子水平筛选不同的组,r,dplyr,tibble,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)) set.seed(5) df=1993对于A级,y>=1994对于B级,y>=1995对于C级,y>=1996对于D级,y>=1997对于E级,y>=1993对于F级,y

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

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))
set.seed(5)

df=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%>%
过滤器(x==“A”&y>=1993)|(x==“B”&y>=1994)|(x==“C”&y>=1995))
x y z
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
编辑:使用更新的数据和条件:

    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
set.seed(520)
df%>%
过滤器(当(x%在%c(“A”、“F”)~y>=1993时,
x%以%c(“c”,“a”)表示,y>=1995年,
x==“D”~y>=1996,
x==“G”~y>=1994年,
x==“E”~y>=1997,
真~y>=2000)
#一个tibble:90x3
x y z
1 A 1999 3
2 C 1998 5
3 F 1993 8
4 G 1997 7
5小时2000 5
6K 20002
7 P 2000 2
8 V 2000 9
9 W 2000 1
10 g 2000 7
#…还有80行
备注::

  • 数据:种子设定为520时的状态

  • 我觉得这种方法有点过于手工。也许有更好的办法


  • 他们总是只有三个级别吗?不,我有更多级别。实际上,我有38个级别的x,我想根据yth的不同值进行过滤,从而使解决方案有所不同。你不能只过滤38层。您可以添加带有
    dput(head(df,n))
    和更多条件的样本数据吗?我现在编辑了38个级别,包含更多条件。请看一下,我有A和A,我认为是不同的级别。
        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