我试图使用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
我希望这很容易理解.我只是无法理解为什么汇总统计在包装函数之外完美地工作,但是一旦我将参数传递给它,它就会为每一行计算相同的东西.任何帮助将不胜感激.
谢谢,凯夫
您需要使用标准评估来以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 median1 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