【发布时间】:2020-03-29 16:55:41
【问题描述】:
我希望能够使用 dplyr 使用不同的分组变量/参数动态构造函数调用。函数调用的数量可能非常大,这意味着programming with dplyr 小插图中的示例不实用。理想情况下,我希望能够预先构造一个对象(例如列表),该对象存储要在每个函数调用中传递的参数/变量。下面是一个示例数据集,我们希望在其中应用一些基于更改分组变量的汇总函数。
set.seed(1)
df <- data.frame(values = sample(x = 1:10, size = 10),
grouping_var1 = sample(x = letters[1:2], size = 10, replace = TRUE),
grouping_var2 = sample(x = letters[24:26], size = 10, replace = TRUE),
grouping_var3 = sample(x = LETTERS[1:2], size = 10, replace = TRUE))
> df
values grouping_var1 grouping_var2 grouping_var3
1 9 a x B
2 4 a z B
3 7 a x A
4 1 a x B
5 2 a x A
6 5 b x A
7 3 b y B
8 10 b x A
9 6 b x B
10 8 a y B
按照programming with dplyr 小插图,我们可以想出这样的解决方案:
f <- function(df, ...){
group_var <- enquos(...)
df %>%
group_by(!!! group_var) %>%
summarise_at(.vars = "values", .funs = sum) %>%
print(n = 10)
}
> f(df, grouping_var1)
# A tibble: 2 x 2
grouping_var1 values
<fct> <int>
1 a 31
2 b 24
> f(df, grouping_var1, grouping_var2)
# A tibble: 5 x 3
# Groups: grouping_var1 [2]
grouping_var1 grouping_var2 values
<fct> <fct> <int>
1 a x 19
2 a y 8
3 a z 4
4 b x 21
5 b y 3
如果我想构造大量的调用,上面的例子是不切实际和不灵活的。另一个限制是我可能希望包含的其他信息不能轻易地一起传递或除了分组变量之外。
假设我有一个列表,其中包含我想在每个函数调用中传递的分组变量。还假设对于这些列表元素中的每一个,都有一个带有“id”的单独字段来描述所执行的分组。请参阅下面的示例:
list(group_vars = list(c("grouping_var1"),
c("grouping_var1", "grouping_var2"),
c("grouping_var1", "grouping_var3")),
group_ids = list("var_1",
c("var_1_2"),
c("var_1_3")))
如何将这些参数/变量和 ID 列表动态传递给函数调用,并使用 dplyr 成功评估它们?假设我想在结果数据框中创建一个列,除了汇总数据之外还包含 group_ids。例如,如果我的 group_vars 是 c("grouping_var1", "grouping_var2") 并且 group_ids 是 "var_1_2" 对于特定的函数调用,我希望输出:
# A tibble: 5 x 4
# Groups: grouping_var1 [2]
grouping_var1 grouping_var2 values group_ids
<fct> <fct> <int> <chr>
1 a x 19 var_1_2
2 a y 8 var_1_2
3 a z 4 var_1_2
4 b x 21 var_1_2
5 b y 3 var_1_2
我希望看到一个解决方案在没有的情况下使用现在已弃用的接受字符串的group_by_ 函数。
最后,我觉得在使用 NSE 的函数中使用 dplyr 进行编程具有这样的进入障碍,这令人相当沮丧。每当我遇到一些应该很简单的事情时,都需要花费数小时才能找到解决方案。
【问题讨论】: