按 'x' 进行分组后,创建一个 &
条件 - 1) 检查 'y' 的 first
值是否为 'a',2) 检查列中的值是否为 'a'、'c'。
library(dplyr)
df %>%
group_by(x) %>%
filter('a' == first(y), y %in% c('a', 'c')) %>%
ungroup
-输出
# A tibble: 5 × 2
x y
<dbl> <chr>
1 1 a
2 1 a
3 1 c
4 3 a
5 3 c
如果我们有额外的规则,创建一个名为list
的列表,在这个列表中,名称将是'y'的第一个值,需要过滤的值的向量,然后根据'y'的第一个值提取list
元素,并在逻辑表达式中使用该向量和%in%
操作符。
df %>%
group_by(x) %>%
filter(y %in% list(a = c('a', 'c'), e = 'e')[[first(y)]]) %>%
ungroup
-输出
# A tibble: 7 × 2
x y
<dbl> <chr>
1 1 a
2 1 a
3 1 c
4 2 e
5 2 e
6 3 a
7 3 c
这里有另一种 dplyr
的选项
> df %>%
+ filter(y %in% c("a", "c") & ave(y == "a", x, FUN = first))
x y
1 1 a
2 1 a
3 1 c
4 3 a
5 3 c
if/else
,但是这种方式更容易通过超过2个条件。 - akrun