首页 > 解决方案 > R参数未在自定义函数中传递给管道

问题描述

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

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

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)

返回相同的错误消息:

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

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

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

任何有关如何修复该功能以使其运行和/或如何改进上述功能的建议将不胜感激;我是编写自己的函数的新手,但我正在尝试使用它们,而不仅仅是在可能的情况下复制和粘贴代码。

标签: rfunctiondplyrmagrittr

解决方案


我还想建议您使用rlang语法,但确实有一些不同的方法。您必须使用引号让 dplyr 以您希望在函数中提供它们的方式接受 varnames。以下代码对我有用。还可以在这里查看vignette("programming", "dplyr")RStudio 备忘单https://rstudio.com/resources/cheatsheets/rlang

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)
}

推荐阅读