没有将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表?

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

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

我也想建议您使用rlang语法,但确实有一些不同的方法。您必须使用引号让dplyr接受varname,就像您希望在函数中提供它们一样。以下代码对我有效。也可以在这里查看vignette("programming", "dplyr")rlang的RStudio备忘单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)
}

尝试使用rlang中的卷曲来传递函数中的未引用变量

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)

最新更新