R 参数未传递给自定义函数中的管道

R arguments not being passed to pipe within custom function

我经常需要执行一系列管道操作,这些操作按一个或多个(通常是两个)变量分组,找到一个或多个变量的均值和置信区间,并将结果输出到摘要中table 用于绘图或报告。

通常我通过复制和粘贴脚本来做到这一点,例如:

aggdata <- data %>% group_by(Time, Category) %>%
    summarise(mean.Volume = mean(Volume, na.rm = TRUE),
              sd.Volume = sd(Volume, na.rm = TRUE),
              n.Volume = n(),
              Volume = sum(Volume))%>%
    mutate(se.Volume = sd.Volume / sqrt(n.Volume),
           lower.ci.Volume = mean.Volume - qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume,
           upper.ci.Volume = mean.Volume + qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume)

所以我尝试为此编写一个函数,但是对于以下两个:

aggvols1 <- function(data, a, b, values) {
   data %>% group_by(a, b) %>%
    summarise(mean.Volume = mean(values, na.rm = TRUE),
              sd.Volume = sd(values, na.rm = TRUE),
              n.Volume = n(),
              Volume = sum(values))%>%
    mutate(se.Volume = sd.Volume / sqrt(n.Volume),
           lower.ci.Volume = mean.Volume - qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume,
           upper.ci.Volume = mean.Volume + qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume)
}

aggvols2 <- function(data, a, b, values) {
  groupvars <-c(data$a,data$b) #also does not work if just use c(a,b)
  data %>% group_by(groupvars) %>%
    summarise(mean.Volume = mean(values, na.rm = TRUE),
              sd.Volume = sd(values, na.rm = TRUE),
              n.Volume = n(),
              Volume = sum(values))%>%
    mutate(se.Volume = sd.Volume / sqrt(n.Volume),
           lower.ci.Volume = mean.Volume - qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume,
           upper.ci.Volume = mean.Volume + qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume)
}

后跟例如

test <- aggvols1(data=salesdata, a=Participation, b=Time_Period, values=volumes_sold)

returns同样的错误信息:

Error in aggvols1(data=salesdata, a=Participation, b=Time_Period, values=volumes_sold) : 
  unused arguments (a = Participation, b = Time_Period)

如何使参数 a 和 b 作为分组变量传递,以便函数 returns a table 的分组均值和 CI?

最终我的目标不仅仅是获得这个 运行 而是改变它以便我可以指定一个分组变量向量和一个值向量而不是指定两个分组变量列和一个单一值列变量,以便它可以分组并计算一个或多个列的响应,将每个输入 "values" 变量的列名称作为后缀添加到每个输出列以进行区分。

任何关于如何修复该功能使其运行的建议and/or如何改进上述功能将不胜感激;我刚开始编写自己的函数,但正在尝试使用它们,而不是尽可能地复制和粘贴代码。

尝试使用 rlang 中的 curly-curly 在函数中传递不带引号的变量

library(dplyr)
library(rlang) 


aggvols1 <- function(data, a, b, values) {
   data %>% 
      group_by({{a}}, {{b}}) %>%
      summarise(mean.Volume = mean({{values}}, na.rm = TRUE),
                sd.Volume = sd({{values}}, na.rm = TRUE),
                n.Volume = n(),
                Volume = sum({{values}}))%>%
      mutate(se.Volume = sd.Volume / sqrt(n.Volume),
             lower.ci.Volume = mean.Volume - qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume,
             upper.ci.Volume = mean.Volume + qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume)
}

假设qt是定义的另一个函数,那么你可以通过

调用函数aggvols
aggvols(data=salesdata, a=Participation, b=Time_Period, values=volumes_sold)

我也想建议您使用 rlang 语法,但确实有一些不同的方法。 您必须使用引号让 dplyr 以您希望在函数内提供它们的方式接受变量名。 以下代码对我有用。 另请查看 vignette("programming", "dplyr") 和 RStudio Cheat Sheet for rlang here https://rstudio.com/resources/cheatsheets/.

aggvols1 <- function(data, a, b, values) {

  a <- enquo(a)
  b <- enquo(b)
  values <- enquo(values)

  data %>% group_by(!! a, !! b) %>%
    summarise(mean.Volume = mean(!! values, na.rm = TRUE),
              sd.Volume = sd(!! values, na.rm = TRUE),
              n.Volume = n(),
              Volume = sum(!! values))%>%
    mutate(se.Volume = sd.Volume / sqrt(n.Volume),
           lower.ci.Volume = mean.Volume - qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume,
           upper.ci.Volume = mean.Volume + qt(1 - (0.05 / 2), n.Volume - 1) * se.Volume)
}