R参数未传递到自定义函数

时间:2019-11-14 09:58:02

标签: r function dplyr magrittr

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

通常,我通过复制和粘贴脚本来执行此操作,例如:

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的表?

最终,我的目标不仅是运行此命令,还需要对其进行更改,以便代替指定两个分组变量列和单个值列,我可以指定一个分组变量向量和一个值变量向量以便它可以分组并计算一个或多个列的响应,然后将每个输入“值”变量的列名作为后缀添加到每个输出列以进行区分。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

尝试使用rlang中的curl-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)