Выбор функции в самостоятельной функции с Tidyeval - PullRequest
3 голосов
/ 02 мая 2019

Так что этот пример в основном из https://tidyeval.tidyverse.org/dplyr.html#patterns-for-single-arguments, и он работает просто отлично:

library(tidyverse)
group_mean <- function(df, group_var, summary_var){
  group_var <-  rlang::enquo(group_var)
  summary_var <-rlang::enquo(summary_var)

  name <- paste0(rlang::quo_name(summary_var), "_mean")

  df %>%
    dplyr::group_by(!!group_var) %>%
    dplyr::summarise(!!name := mean(!!summary_var, na.rm = TRUE))
}

mtcars %>% group_mean(group_var = cyl, summary_var = disp)
#> # A tibble: 3 x 2
#>     cyl disp_mean
#>   <dbl>     <dbl>
#> 1     4      105.
#> 2     6      183.
#> 3     8      353.

Я хотел бы, например, иметь возможность иногда выбирать медиану вместо среднего и, например, изменять имя функциидо group_stat().

1 Ответ

5 голосов
/ 02 мая 2019

Вы можете сделать что-то вроде этого.Я не совсем уверен, как именно это работает, но я видел этот метод, используемый в исходном коде library(purrr) для as_mapper():

https://github.com/tidyverse/purrr/blob/master/R/as_mapper.R

library(tidyverse)

group_stat <- function(df, group_var, summary_var, .f) {

    func <- rlang::as_closure(.f)

    group_var <-  rlang::enquo(group_var)
    summary_var <-rlang::enquo(summary_var)

    name <- paste0(rlang::quo_name(summary_var), "_", deparse(substitute(.f)))

    df %>%
        dplyr::group_by(!!group_var) %>%
        dplyr::summarise(!!name := func(!!summary_var, na.rm = TRUE))
}

mtcars %>% 
    group_stat(group_var = cyl, summary_var = disp, median)
#> # A tibble: 3 x 2
#>     cyl disp_median
#>   <dbl>       <dbl>
#> 1     4        108 
#> 2     6        168.
#> 3     8        350.

mtcars %>% 
    group_stat(group_var = cyl, summary_var = disp, mean)
#> # A tibble: 3 x 2
#>     cyl disp_mean
#>   <dbl>     <dbl>
#> 1     4      105.
#> 2     6      183.
#> 3     8      353.

mtcars %>% 
    group_stat(group_var = cyl, summary_var = disp, max)
#> # A tibble: 3 x 2
#>     cyl disp_max
#>   <dbl>    <dbl>
#> 1     4     147.
#> 2     6     258 
#> 3     8     472

mtcars %>% 
    group_stat(group_var = cyl, summary_var = disp, min)
#> # A tibble: 3 x 2
#>     cyl disp_min
#>   <dbl>    <dbl>
#> 1     4     71.1
#> 2     6    145  
#> 3     8    276.

Создано в 2019-05-02 пакетом Представ (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...