r-使用dplyr filter_at()函数选择有条件的行



我想根据几列中的特定条件过滤数据帧。

我用下面的例子使我的陈述更加清楚。

我有一个数据帧:

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

最新更新