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

时间:2019-02-06 18:52:35

标签: r filter dplyr

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

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

我有一个数据框:

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))

它没有用。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以这样做:

dat %>%
    group_by(A, B) %>%
    filter_at(vars(C, D), all_vars(. == max(.)))

以前的问题是all_vars(),它的评估结果是合乎逻辑的。而且,如果没有相等运算符==><,就会向您抛出错误。

答案 1 :(得分:0)

从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