如何编写与 dplyr::filter 接口相同但功能不同的函数

How to write a function with same interface as dplyr::filter but which is doing something different

我想实现一个函数,它与 dplyr 中的过滤器方法具有相同的接口,但不是删除不符合条件的行,例如,return 一个带有指示变量的数组,或将此类专栏附加到 returned tibble?

我会发现它非常有用,因为它可以让我计算过滤前后某些列的摘要以及本应在单个小标题上删除的行的摘要。

我觉得dplyr::filter界面很方便,所以想效仿一下。

我想group_by会在这里帮助你

您通常可以这样筛选然后汇总

library(dplyr)
mtcars %>%
  filter(cyl==4) %>%
  summarise(mean=mean(gear))

      # mean
# 1 4.090909

您可以group_by,总结,然后过滤

mtcars %>%
  group_by(cyl) %>%
  summarise(mean=mean(gear))
  # optional filter here

# # A tibble: 3 x 2
    # cyl     mean
  # <dbl>    <dbl>
# 1     4 4.090909
# 2     6 3.857143
# 3     8 3.285714

您也可以按条件分组,就像这样

mtcars %>%
  group_by(cyl > 4) %>%
  summarise(mean=mean(gear))

# # A tibble: 2 x 2
  # `cyl > 4`     mean
      # <lgl>    <dbl>
# 1     FALSE 4.090909
# 2      TRUE 3.476190

您需要 quo!!(或 UQ())。请参阅以下示例:

df <- tibble(
 g1 = c(1, 1, 2, 2, 2),
 g2 = c(1, 2, 1, 2, 1),
 a = sample(5), 
 b = sample(5)

)

my_summarise <- function(df, group_by) {
   quo_group_by <- quo(group_by)
   print(quo_group_by)

   df %>%
      group_by(!!quo_group_by) %>%
      summarise(a = mean(a))
}


my_summarise(df, g1)

有关更多示例和讨论,请参阅 http://dplyr.tidyverse.org/articles/programming.html