按不同的因素水平过滤不同的组
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
注释::
数据:种子设置为 520
我觉得这种方法有点太手动了。可能有更好的方法。
我有一个如下所示的数据框。
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
注释::
数据:种子设置为 520
我觉得这种方法有点太手动了。可能有更好的方法。