我有一个数据框,如下所示。
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
个动词?
答案 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
注释::
数据:将种子设置为520
我觉得这种方法太手工了。也许有更好的方法。
答案 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