【问题标题】:Passing arguments to dplyr summarize function将参数传递给 dplyr 汇总函数
【发布时间】:2017-06-06 14:35:27
【问题描述】:

我正在尝试使用 dplyr 中的汇总函数来计算汇总统计信息,该函数使用两个参数函数从连接的数据库传递表和字段名称。不幸的是,一旦我用另一个函数包装了 summarise 函数,结果就不正确了。最终表是一个不会遍历每一行的数据框。我将在下面显示输入/输出:

汇总统计函数 库(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

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

谢谢,凯夫

【问题讨论】:

  • 在不知道您如何使用包装器功能的情况下很难诊断。但猜测一下,一旦进入包装函数,summarize 可能不知道计算中使用的分组因子。因此它将为所有行返回相同的摘要。
  • @jdobres 我将添加包装函数。对此感到抱歉。
  • 您需要使用标准评估。阅读上面的 dplyr 小插图以获得更好的想法。

标签: r statistics dplyr


【解决方案1】:

您需要使用非标准评估 (NSE) 以编程方式使用 dplyr 函数和 lazyevaldplyr NSE 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

【讨论】:

  • 感谢您回答我的问题,更重要的是感谢您链接到有关如何以编程方式使用 dplyr 的文档。我正在寻找类似的东西,但无法找到它。我非常感谢您回答的彻底性。再次感谢伙计。
  • NSE 小插图链接已失效,看起来它已被 Programming with dplyr vignette 替换。
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2015-07-01
相关资源
最近更新 更多