Передача аргументов в функцию суммирования 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