【发布时间】:2020-03-09 15:32:51
【问题描述】:
我正在尝试在我自己的函数中使用 R 中 tidyverse 的准引用来解决问题。我在这里读过这个:Passing a list of arguments to a function with quasiquotation 和这里的全部内容: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)))
}
我的代码有什么问题? IE。我特别与 !!, !!!, sym, enquo, enquos 的事情作斗争。为什么 group_by_at 东西不需要 !!东西,而我的汇总和变异确实需要它?
【问题讨论】:
-
您一次只能问一个问题。使用带有示例输入和所需输出的明确reproducible example 专注于一个明确的问题。要求“提示”或“最佳方式”做事而不定义“最佳”的确切含义的广泛问题在这里是题外话。
-
我编辑了我的问题,使它们现在更加集中。我发现不被“允许”询问“提示”和“最佳方式”有点令人困惑。在我目前学习 R 的阶段,这些(不同的)意见对我来说很有价值,尤其是在没有正确或错误答案的情况下。
-
@G.Grothendieck 我希望这更接近你的期望。