我想根据几列中的特定条件过滤数据帧。
我用下面的例子使我的陈述更加清楚。
我有一个数据帧:
dat <- data.frame(A = c(122, 122, 122), B = c(0.1, 0.1, 0.1),
C = c(5, 5, 4), D = c(6, 7, 6))
我想选择在C列和D列都包含最大值的行,我的R代码是:
select <- dat %>%
group_by(A, B) %>%
filter(C == max(C) , D == max(D))
我得到了想要的东西:
> select
# A tibble: 1 x 4
# Groups: A, B [1]
A B C D
<dbl> <dbl> <dbl> <dbl>
1 122 0.1 5 7
但是,我想使用filter_at()
功能
select <- dat %>%
group_by(A, B) %>%
filter_at(vars(C, D), all_vars(. max))
它不起作用。非常感谢你的帮助。
您可以这样做:
dat %>%
group_by(A, B) %>%
filter_at(vars(C, D), all_vars(. == max(.)))
之前的问题是all_vars()
期望评估为逻辑。如果没有相等运算符==
、>
、<
,它会向您抛出错误。
从dplyr 1.0开始,有一种新的选择、过滤和变异方法。这是通过across
函数和某些辅助动词来实现的。对于这种特殊情况,过滤也可以如下完成:
dat %>%
group_by(A, B) %>%
filter(across(c(C, D), ~ . == max(.)))
# A tibble: 1 x 4
# Groups: A, B [1]
A B C D
<dbl> <dbl> <dbl> <dbl>
1 122 0.1 5 7