Передача аргументов в функцию суммирования dplyr

Я пытаюсь использовать функцию суммирования в dplyr для вычисления сводной статистики, используя функцию с двумя аргументами, которая передает таблицу и имя поля из подключенной базы данных. К сожалению, как только я обертываю функцию суммирования другой функцией, результаты не верны. Конечная таблица - это фрейм данных, который не перебирает каждую строку. Я покажу вход / выход ниже:

Библиотека функций сводной статистики (dplyr)

data<-iris
data<- group_by(.data = data,Species)

SummaryStatistics <- function(table, field){
table %>%
summarise(count = n(),
          min = min(table[[field]], na.rm = T),
          mean = mean(table[[field]], na.rm = T, trim=0.05),
          median = median(table[[field]], na.rm = T))
}

SummaryStatistics(data, "Sepal.Length")

Таблица вывода - неверно, просто повторяется тот же расчет

     Species count   min     mean median
1     setosa    50   4.3 5.820588    5.8
2 versicolor    50   4.3 5.820588    5.8
3  virginica    50   4.3 5.820588    5.8

Правильный стол / желаемый результат - так должна выглядеть таблица. Когда я запускаю функцию суммирования, выходящую за пределы функции-обертки, это то, что она производит.

      Species count   min     mean median
 1     setosa    50   4.3 5.002174    5.0
 2 versicolor    50   4.9 5.934783    5.9
 3  virginica    50   4.9 6.593478    6.5

Я надеюсь, что это легко понять. Я просто не могу понять, почему сводная статистика отлично работает вне функции-оболочки, но как только я передам ей аргументы, она вычислит одно и то же для каждой строки. Любая помощь будет принята с благодарностью.

Спасибо кев

1 ответ

Решение

Вы должны использовать стандартную оценку, чтобы использовать dplyr работает программно вместе lazyeval, dplyr Виньетка NSE покрывает это довольно хорошо.

library(dplyr)
library(lazyeval)

data <- group_by(iris, Species)

SummaryStatistics <- function(table, field){
  table %>%
    summarise_(count = ~n(),
              min = interp(~min(var, na.rm = T), var = as.name(field)),
              mean = interp(~mean(var, na.rm = T, trim=0.05), var = as.name(field)),
              median = interp(~median(var, na.rm = T), var = as.name(field)))
}

SummaryStatistics(data, "Sepal.Length")

# A tibble: 3 × 5
     Species count   min     mean median
      <fctr> <int> <dbl>    <dbl>  <dbl>
1     setosa    50   4.3 5.002174    5.0
2 versicolor    50   4.9 5.934783    5.9
3  virginica    50   4.9 6.593478    6.5
Другие вопросы по тегам