将参数传递给dplyr汇总函数

Alp*_*evy 1 statistics r 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")
Run Code Online (Sandbox Code Playgroud)

输出表 - 不正确,它只是重复相同的计算

     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
Run Code Online (Sandbox Code Playgroud)

正确的表格/期望的结果 -这就是表格的样子.当我运行包装函数的概括函数时,这就是它产生的东西.

      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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,凯夫

Jak*_*upp 8

您需要使用标准评估来以dplyr编程方式使用函数lazyeval.该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
Run Code Online (Sandbox Code Playgroud)

  • NSE vignette 链接已失效,看起来已被 [Programming with dplyr vignette](https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html) 取代。 (3认同)
  • 感谢您回答我的问题,更重要的是感谢您链接到有关如何以编程方式使用 dplyr 的文档。我正在寻找类似的东西但无法找到它。我真的很欣赏你回答的彻底性。再次感谢伙计。 (2认同)