【问题标题】:How to write a function with same interface as dplyr::filter but which is doing something different如何编写与 dplyr::filter 具有相同接口但执行不同操作的函数
【发布时间】:2018-02-21 03:06:48
【问题描述】:

我想实现一个函数,它与 dplyr 中的过滤器方法具有相同的接口,但不是删除与条件不匹配的行,而是返回一个带有指示变量的数组,或将此类列附加到返回的小标题?

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

我发现 dplyr::filter 接口非常方便,因此想效仿它。

【问题讨论】:

  • 听起来你在描述dplyr::mutate。这是否符合您的要求?

标签: r filter dplyr tidyverse tibble


【解决方案1】:

您需要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

【讨论】:

    【解决方案2】:

    我认为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多