Как передать имя столбца из фрейма данных в функцию с использованием синтаксиса tidyverse? - PullRequest
0 голосов
/ 10 июля 2020
cars %>%
  group_by(cyl) %>%
  summarise_each(funs(mean(., na.rm = TRUE), 
                      min(., na.rm = TRUE), 
                      max(., na.rm = TRUE), 
                      sd(., na.rm = TRUE)), 
                      mpg, wt)

Я хочу превратить приведенный выше код в функцию, в которой фрейм данных (автомобили) и столбец (цил) являются аргументами. Как я могу сделать это в R?

Я пробовал следующее ниже, но это не оценивает

plot_cars <- function (df, col) {
df %>%
  group_by(col) %>%
  summarise_each(funs(mean(., na.rm = TRUE), 
                      min(., na.rm = TRUE), 
                      max(., na.rm = TRUE), 
                      sd(., na.rm = TRUE)), 
                      mpg, wt)
}

plot_cars(cars,"cyl")

Ответы [ 4 ]

0 голосов
/ 10 июля 2020

Если нам нужно передать строку, преобразуйте в sym и оцените. Но для большей гибкости лучше преобразовать в ensym, чтобы можно было принимать как без кавычек, так и в кавычках

library(dplyr)#1.0.0
plot_cars <- function (df, col) {
col <- ensym(col)
df %>%
  group_by(!!col) %>%
  summarise(across(c(mpg, wt),
              list(mean = ~ mean(., na.rm = TRUE),
                   min = ~ min(., na.rm = TRUE),
                   max = ~ max(., na.rm = TRUE),
                   sd = ~ sd(., na.rm = TRUE))))
  
                    
   }

plot_cars(mtcars,"cyl")
# A tibble: 3 x 9
#    cyl mpg_mean mpg_min mpg_max mpg_sd wt_mean wt_min wt_max wt_sd
#  <dbl>    <dbl>   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>  <dbl> <dbl>
#1     4     26.7    21.4    33.9   4.51    2.29   1.51   3.19 0.570
#2     6     19.7    17.8    21.4   1.45    3.12   2.62   3.46 0.356
#3     8     15.1    10.4    19.2   2.56    4.00   3.17   5.42 0.759


plot_cars(mtcars, cyl)
# A tibble: 3 x 9
#    cyl mpg_mean mpg_min mpg_max mpg_sd wt_mean wt_min wt_max wt_sd
#  <dbl>    <dbl>   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>  <dbl> <dbl>
#1     4     26.7    21.4    33.9   4.51    2.29   1.51   3.19 0.570
#2     6     19.7    17.8    21.4   1.45    3.12   2.62   3.46 0.356
#3     8     15.1    10.4    19.2   2.56    4.00   3.17   5.42 0.759
0 голосов
/ 10 июля 2020

Это аналогичное решение с ленивым вычислением.

plot_cars <- function (df, ...) {
  df %>%
    group_by_(.dots = lazyeval::lazy_dots(...)) %>%
    summarise_each(funs(mean(., na.rm = TRUE), 
                        min(., na.rm = TRUE), 
                        max(., na.rm = TRUE), 
                        sd(., na.rm = TRUE)), 
                   mpg, wt)

plot_cars(mtcars, cyl)
}

Если вы хотите узнать об этом больше, перейдите по этой ссылке: https://medium.com/optima-blog/writing-your-own-dplyr-functions-a1568720db0d

0 голосов
/ 10 июля 2020
foo = function(d, grp, ...) {
    d %>%
        group_by_at(grp) %>%
        summarise_at(c(...), funs(mean(., na.rm = TRUE), 
                                  min(., na.rm = TRUE), 
                                  max(., na.rm = TRUE), 
                                  sd(., na.rm = TRUE)))
}

foo(mtcars, "cyl", "mpg", "wt")
0 голосов
/ 10 июля 2020

Вы можете попробовать это:

plot_cars <- function (df,...) {
  dots <- enquos(...)
  df %>%
    group_by(vars(!!!dots)) %>%
    summarise_each(funs(mean(., na.rm = TRUE), 
                        min(., na.rm = TRUE), 
                        max(., na.rm = TRUE), 
                        sd(., na.rm = TRUE)), 
                   mpg, wt)
}

plot_cars(mtcars,cyl)

# A tibble: 1 x 9
  `vars(cyl)` mpg_mean wt_mean mpg_min wt_min mpg_max wt_max mpg_sd wt_sd
  <quos>         <dbl>   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>  <dbl> <dbl>
1 cyl             20.1    3.22    10.4   1.51    33.9   5.42   6.03 0.978
...