r - 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 的表?
最终我的目标不仅仅是让它运行,而是改变它,而不是指定两个分组变量列和一个值列,我可以指定一个分组变量向量和一个值变量向量,以便它可以分组并计算一个或多个列的响应,将每个输入“值”变量的列名作为后缀添加到每个输出列以进行区分。
任何有关如何修复该功能以使其运行和/或如何改进上述功能的建议将不胜感激;我是编写自己的函数的新手,但我正在尝试使用它们,而不仅仅是在可能的情况下复制和粘贴代码。
解决方案
我还想建议您使用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)
}
推荐阅读
- c++ - 解除引用的指针或迭代器的类型是什么?
- mysql - SQL ORDER BY 具有动态多个值的特定序列?
- javascript - 查找单个数组元素之间的交集
- freeradius - Termination-Action 和 Session-Timeout 是如何工作的?
- youtube - 我想在 Youtube 中禁用快进但不快退
- python - 在 2 条不同的行中重用颜色 matplotlib
- python - 如何在 Python Numpy 中将列表添加到 ArrayList
- java - 在 Java 中使用 Scanner 时如何检查文件是否存在
- javascript - 提取 JSON 值并打印到 HTML
- scala - 如何在调用主构造函数之前处理辅助构造函数中的参数?