将参数传递给dplyr的summarize函数

4
我正在尝试使用dplyr中的summarize函数,使用传递来自连接数据库的表和字段名称的两个参数的函数来计算摘要统计信息。不幸的是,一旦我用另一个函数包装summarize函数,结果就不正确了。最终的表格是一个数据框,而不是遍历每一行。下面我将展示输入/输出: 摘要统计信息函数 library(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

希望这很容易理解。我只是不明白为什么总结统计数据在包装函数之外完美运作,但一旦我传递参数给它,它就会为每一行计算相同的东西。任何帮助都将不胜感激。

谢谢,Kev


1
没有知道如何使用封装函数就很难诊断。但猜测一下,在封装函数内部,summarize 可能不知道在计算中使用的分组因素。因此,它将为所有行返回相同的摘要。 - jdobres
@jdobres 我会添加包装函数。对此我很抱歉。 - AlphaKevy
1
你需要使用标准评估。阅读dplyr的文档以获得更好的理解。 - Jake Kaupp
1个回答

13
你需要使用非标准评估(NSE)才能在程序化地与lazyeval一起使用dplyr函数。 dplyrNSE说明文档阐述得相当清楚。
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

2
谢谢您回答我的问题,更重要的是感谢您提供了关于如何在程序中使用dplyr的文档链接。我一直在寻找这样的东西,但一直没有找到。我真的很感激您回答的详细程度。再次感谢您。 - AlphaKevy
3
NSE小品链接已失效,似乎已被“使用dplyr进行编程的小品”替换。链接地址为:https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html - ropeladder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接