Purrr и Rlang - функции отображения с квази-цитатой - PullRequest
1 голос
/ 07 января 2020

Если у меня есть функция, определенная с помощью rlang, как я могу использовать purrr :: map для использования ее с несколькими переменными?

Предположим, у меня есть функция, определенная как:

mean_by <- function(data, by, var) {
  data %>%
    group_by({{ by }}) %>%
    summarise(avg = mean({{ var }}, na.rm = TRUE))
}

Что вычисляет групповое значение,

Предпочтительно, используя решение purrr :: map, как я могу применить эту функцию для нескольких переменных «by», но для одного «var» во фрейме данных?

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Тебе нужен !!! оператор или использование group_by_at

library(tidyverse)


mean_by <- function(data, by, var) {
  data %>%
    group_by_at(by) %>% 
    summarise(avg = {{var}} %>% mean(na.rm =TRUE))
}


mtcars %>% 
  mean_by(by = vars(mpg,cyl),hp)
#> # A tibble: 27 x 3
#> # Groups:   mpg [25]
#>      mpg   cyl   avg
#>    <dbl> <dbl> <dbl>
#>  1  10.4     8   210
#>  2  13.3     8   245
#>  3  14.3     8   245
#>  4  14.7     8   230
#>  5  15       8   335
#>  6  15.2     8   165
#>  7  15.5     8   150
#>  8  15.8     8   264
#>  9  16.4     8   180
#> 10  17.3     8   180
#> # … with 17 more rows


# or


mean_by <- function(data, by, var) {
  data %>%
    group_by(!!!by) %>% 
    summarise(avg = {{var}} %>% mean(na.rm =TRUE))
}


mtcars %>% 
  mean_by(by = vars(cyl,disp),hp)
#> # A tibble: 27 x 3
#> # Groups:   cyl [3]
#>      cyl  disp   avg
#>    <dbl> <dbl> <dbl>
#>  1     4  71.1    65
#>  2     4  75.7    52
#>  3     4  78.7    66
#>  4     4  79      66
#>  5     4  95.1   113
#>  6     4 108      93
#>  7     4 120.     97
#>  8     4 120.     91
#>  9     4 121     109
#> 10     4 141.     95
#> # … with 17 more rows

Создано в 2020-01-07 с помощью пакета Представить (v0.3.0)

0 голосов
/ 08 января 2020

Хорошей альтернативой является "передать точки" .

Первым аргументом будет единственная переменная, которую вы хотите суммировать, и используйте ... для передачи всех (если таковые имеются) группирующих переменных, которые вы хотите.

Таким образом, у вас есть более чистый синтаксис для вашей функции, и вы избегаете включения функции vars.

library(tidyverse)


mean_by <- function(data, var, ...) {
  data %>%
    group_by(...) %>% 
    summarise(avg = {{var}} %>% mean(na.rm =TRUE))
}


mtcars %>% 
  mean_by(hp, cyl, disp)
#> # A tibble: 27 x 3
#> # Groups:   cyl [3]
#>      cyl  disp   avg
#>    <dbl> <dbl> <dbl>
#>  1     4  71.1    65
#>  2     4  75.7    52
#>  3     4  78.7    66
#>  4     4  79      66
#>  5     4  95.1   113
#>  6     4 108      93
#>  7     4 120.     97
#>  8     4 120.     91
#>  9     4 121     109
#> 10     4 141.     95
#> # ... with 17 more rows


mtcars %>% 
  mean_by(hp)
#> # A tibble: 1 x 1
#>     avg
#>   <dbl>
#> 1  147.

Создано в 2020-01-08 Представить пакет (v0.3.0)

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