【问题标题】:using dplyr filter_at() function to select rows with conditions使用 dplyr filter_at() 函数选择有条件的行
【发布时间】:2019-06-30 19:41:58
【问题描述】:

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

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

我有一个数据框:

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

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

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:

    你可以这样做:

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

    之前的问题是all_vars() 期望评估为合乎逻辑的。如果没有相等运算符==、&gt;、&lt;,它会向您抛出一个错误。

    【讨论】:

      【解决方案2】:

      从 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
      

      【讨论】:

        猜你喜欢
        • 2019-03-29
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 2018-02-03
        • 2022-12-28
        • 2018-10-15
        • 2019-01-05
        相关资源
        最近更新 更多