удалите список функций внутри функций R dplyr - PullRequest
2 голосов
/ 28 марта 2019

Я пытался передать список функций в функцию dplyr summerize_at и получил предупреждение:

library(tidyverse)
library(purrr)

p <- c(0.2, 0.5, 0.8)

p_names <- map_chr(p, ~paste0(.x*100, "%"))

p_funs <- map(p, ~partial(quantile, probs = .x, na.rm = TRUE)) %>% 
  set_names(nm = p_names)

mtcars %>% 
  group_by(cyl) %>% 
  summarize_at(vars(mpg), funs(!!!p_funs))
#> Warning: funs() is soft deprecated as of dplyr 0.8.0
#> please use list() instead
#> 
#> # Before:
#> funs(name = f(.)
#> 
#> # After: 
#> list(name = ~f(.))
#> This warning is displayed once per session.
#> # A tibble: 3 x 4
#>     cyl `20%` `50%` `80%`
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     4  22.8  26    30.4
#> 2     6  18.3  19.7  21  
#> 3     8  13.9  15.2  16.8

Затем я изменил funs на list, но не смог найти способубрать цитаты из списка приколов.

mtcars %>% 
  group_by(cyl) %>% 
  summarize_at(vars(mpg), list(~ !!!p_funs))
#> Error in !p_funs: invalid argument type

mtcars %>% 
  group_by(cyl) %>% 
  summarize_at(vars(mpg), list(~ {{p_funs}}))
#> Error: Column `mpg` must be length 1 (a summary value), not 3

1 Ответ

3 голосов
/ 28 марта 2019

list не поддерживает сращивание (!!!), вместо этого используйте list2 или lst:

mtcars %>% 
  group_by(cyl) %>% 
  summarize_at(vars(mpg), rlang::list2(!!!p_funs))
# # A tibble: 3 x 4
#     cyl `20%` `50%` `80%`
#   <dbl> <dbl> <dbl> <dbl>
# 1     4  22.8  26    30.4
# 2     6  18.3  19.7  21  
# 3     8  13.9  15.2  16.8

mtcars %>% 
  group_by(cyl) %>% 
  summarize_at(vars(mpg), lst(!!!p_funs))
# # A tibble: 3 x 4
#     cyl `20%` `50%` `80%`
#   <dbl> <dbl> <dbl> <dbl>
# 1     4  22.8  26    30.4
# 2     6  18.3  19.7  21  
# 3     8  13.9  15.2  16.8

Хотя здесь самое простое:

mtcars %>% 
  group_by(cyl) %>% 
  summarize_at(vars(mpg), p_funs)
# # A tibble: 3 x 4
#     cyl `20%` `50%` `80%`
#   <dbl> <dbl> <dbl> <dbl>
# 1     4  22.8  26    30.4
# 2     6  18.3  19.7  21  
# 3     8  13.9  15.2  16.8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...