2017-01-21 3 views
0

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

Сводная статистика Функция библиотека (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

Трудно диагностировать, не зная, как вы используете функцию обертки. Но, предположив, что внутри функции обертки «суммирование» может не знать о факторах группировки, используемых в расчете. Таким образом, он возвратит то же самое резюме для всех строк. – jdobres

+0

@jdobres Я добавлю функцию обертки. Извини за это. – AlphaKevy

+1

Вам понадобится стандартная оценка. Прочтите виньетку 'dplyr' на ней для лучшей идеи. –

ответ

4

Вы должны использовать стандартную оценку для использования dplyr функций программно рядом lazyeval. dplyrNSE vignette покрывает его довольно хорошо.

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 
+0

Благодарим вас за ответ на мой вопрос и, что еще важнее, спасибо за ссылку на документ о том, как использовать dplyr программно. Я искал что-то вроде этого, но не мог отследить его. Я очень ценю тщательность вашего ответа. Еще раз спасибо. – AlphaKevy

+0

Ссылка на виньетку NSE мертва, похоже, что она была заменена на [Программирование с помощью dplyr vignette] (https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html). – ropeladder

Смежные вопросы