我试图在我自己的函数中使用 R 中 tidyverse 的准引用来解决问题。我在这里读过这个:将参数列表传递给具有准引用的函数以及这里的全部内容:https ://tidyeval.tidyverse.org/
但我仍然没有让它工作。
假设我有以下数据:
dat <- data.frame(time = runif(20),
group1 = rep(1:2, times = 10),
group2 = rep(1:2, each = 10),
group3 = rep(3:4, each = 10))
我现在要做的是编写一个执行以下操作的函数:
- 取一个数据集
- 指定包含时间的变量(注意,在另一个数据集中,这可能称为“小时”或“qtime”或其他)
- 指定我想对哪些组进行操作/统计
所以我希望用户做的是使用如下功能:
test_function(data = dat, time_var = "time", group_vars = c("group1", "group3"))
请注意,我下次可能会选择不同的分组变量或不选择。
假设在我想要的函数中:
- 计算时间变量的某些统计数据,例如分位数。注意:我想通过我的分组变量来拆分它
这是我最近的尝试之一:
test_function <- function(data, time_var = NULL, group_vars = NULL)
{
# Note I initialize the variables with NULL, since e.g. the user might not specify a grouping
and I want to check for that in my function at some point)
time_var <- enquo(time_var)
group_vars <- enquos(group_vars)
# Here I try to group by my grouping variables
temp_data <- data %>%
group_by_at(group_vars) %>%
mutate(!!sym(time_var) := !!sym(time_var) / 60)
# Here I'm calculating some stats
time_stats <- temp_data %>%
summarize_at(vars(!!time_var), list(p0.1_time = ~quantile(., probs = 0.1, na.rm = T),
p0.2_time = ~quantile(., probs = 0.2, na.rm = T),
p0.3_time = ~quantile(., probs = 0.3, na.rm = T),
p0.4_time = ~quantile(., probs = 0.4, na.rm = T),
p0.5_time = ~quantile(., probs = 0.5, na.rm = T),
p0.6_time = ~quantile(., probs = 0.6, na.rm = T),
p0.7_time = ~quantile(., probs = 0.7, na.rm = T),
p0.8_time = ~quantile(., probs = 0.8, na.rm = T),
p0.9_time = ~quantile(., probs = 0.9, na.rm = T),
p0.95_time = ~quantile(., probs = 0.95, na.rm = T)))
}
我的代码有什么问题?即,我专门与!!,!!!,sym,enquo,enquos 事物作斗争。为什么 group_by_at 东西不需要 !! 东西,而我的汇总和变异确实需要它?