为啥 ``mean`` 函数不能在函数环境中与 ``group_by %>% summarise`` 一起正常工作?

Posted

技术标签:

【中文标题】为啥 ``mean`` 函数不能在函数环境中与 ``group_by %>% summarise`` 一起正常工作?【英文标题】:Why does the ``mean`` function not work properly with ``group_by %>% summarise`` in a function environement?为什么 ``mean`` 函数不能在函数环境中与 ``group_by %>% summarise`` 一起正常工作? 【发布时间】:2020-07-09 16:59:56 【问题描述】:

例如:

df <- data.frame("Treatment" = c(rep("A", 2), rep("B", 2)), "Price" = 1:4, "Cost" = 2:5)

我想通过对所有变量的处理来汇总数据,并将它们放在一起,所以我首先定义一个函数来为每个变量执行此操作,然后再rbind它们。

SummarizeFn <- function(x,y,z) 
                       df1 <- x %>% group_by(Treatment) %>% 
                       summarize(n = n(), Mean = mean(y), SD = sd(y)) %>% 
                       df1$Var = z # add a column to show which variable those statistics belong to. 
                   
SumPrice <- SummarizeFn(df, df$Price, "Price")

但是,结果是:

  Treatment     n  Mean    SD Var  
  <fct>     <int> <dbl> <dbl> <chr>
1 A             2   2.5  1.29 Price
2 B             2   2.5  1.29 Price

它们是所有观察值的平均值和标准差,但不是按治疗分组的观察值。这里有什么问题?

如果我将代码从函数环境中取出,它完全可以正常工作。请帮忙,谢谢。

如果你有更好的方法来实现我的目的,那就太好了!谢谢!

【问题讨论】:

【参考方案1】:

当您在dplyr 管道中使用带有$ 的变量时,它们不尊重分组并且就像它们应用于整个数据帧一样工作。除此之外,您可以使用 来评估函数中的列名。

library(dplyr)

SummarizeFn <- function(x,y,z) 
  x %>% 
    group_by(Treatment) %>% 
    summarize(n = n(), Mean = mean(y), SD = sd(y), Var = z)


SummarizeFn(df, Price, "Price")

#  Treatment     n  Mean    SD Var  
#  <fct>     <int> <dbl> <dbl> <chr>
#1 A             2   1.5 0.707 Price
#2 B             2   3.5 0.707 Price

【讨论】:

【参考方案2】:

这涉及到标准评价的问题。这很有趣,我刚刚写了一个article on the subject。这很难用dplyr 传递字符串名称。如果您需要这样做,请使用rlang::sym(或rlang::syms)和!!(或!!!

关于您的问题,我认为data.table 为您提供了简洁的解决方案

dt <- as.data.table(mtcars)
output <- dt[,lapply(.SD, function(d) return(list(.N,mean(d),sd(d)))),
   .SDcols = c("mpg","qsec")]
output[,'stat' := c("observations","mean","sd")]
output

# output
#    mpg     qsec         stat
# 1:       32       32 observations
# 2: 20.09062 17.84875         mean
# 3: 6.026948 1.786943           sd

我建议使用lapply 的匿名函数,但您可以使用在摘要步骤之前定义的更复杂的函数。如果需要,更改 .SDcols 以包含更多变量

【讨论】:

非常感谢您的评论和解决方案,以及您在 data.table 上的文章。这是一个很好的。 谢谢!希望以后对你有帮助

以上是关于为啥 ``mean`` 函数不能在函数环境中与 ``group_by %>% summarise`` 一起正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 statistics.mean() 这么慢?

为啥我不能在“if”语句中与 '_' 字符进行比较? [关闭]

为啥我的 k-means 收敛条件给出的结果与 sklearn 不同?

为啥不能导入 random模块,求解

为啥在 Keras 度量函数中使用 axis=-1?

如何在没有 Pandas STD 或 Mean 函数的情况下计算滚动 STD?