Как я могу программно использовать dplyr через () без переменных? - PullRequest
5 голосов
/ 14 июля 2020

Проблема:

Я хочу использовать across() программно, чтобы при передаче ему, например, NULL или пустой строки, функция не завершилась ошибкой. Возможно, здесь используются варианты функций с ограниченной областью действия, такие как group_by_at(), но я бы хотел, чтобы он работал аккуратно (т.е. без операторов if), используя across().

Обратите внимание, что в настоящее время across() будет влияет на все столбцы, если оставить пустым. Я не уверен, какова мотивация для этого; для меня было бы больше смысла, если бы никакие столбцы не были затронуты.

Пример

Вот быстрый пример использования функций для вычисления среднего значения переменной y. Передача группирующей переменной работает с group_by_at(), но не с across(), как показано:

my_df <- tibble("x" = c("a", "a", "b", "b"), y = 1:4)

compute_mean1 <- function(df, grouping) { # compute grouped mean with across()
  df %>% 
    group_by(across(all_of(grouping))) %>% 
    summarise(y = mean(y), .groups = "drop")
}

compute_mean2 <- function(df, grouping) { # compute grouped mean with group_by_at()
  df %>% 
    group_by_at(grouping) %>% 
    summarise(y = mean(y), .groups = "drop")
}


compute_mean1(my_df, "x")
#> # A tibble: 2 x 2
#>   x         y
#>   <chr> <dbl>
#> 1 a       1.5
#> 2 b       3.5
compute_mean1(my_df, NULL)
#> Error: `vars` must be a character vector.
compute_mean2(my_df, "x")
#> # A tibble: 2 x 2
#>   x         y
#>   <chr> <dbl>
#> 1 a       1.5
#> 2 b       3.5
compute_mean2(my_df, NULL)
#> # A tibble: 1 x 1
#>       y
#>   <dbl>
#> 1   2.5

Создано 14.07.2020 пакетом REPEX (v0 .3.0)

1 Ответ

4 голосов
/ 14 июля 2020

Используйте .add=TRUE как это:

compute_mean3 <- function(df, grouping) { # compute grouped mean with across()
  df %>% 
    group_by(across(all_of(grouping)), .add = TRUE) %>%
    summarise(y = mean(y), .groups = "drop")
}
 
...