Я хочу иметь возможность динамически создавать вызовы функций с различными группирующими переменными / аргументами, используя dplyr. Количество вызовов функций может быть довольно большим, что означает, что примеры в программировании с виньеткой 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
Следуя программированию с виньеткой 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
Приведенный выше пример непрактичен и негибок, если я хочу построить большое количество звонков. Другое ограничение заключается в том, что другую информацию, которую я могу включить sh, нельзя легко передать вместе или в дополнение к группирующим переменным.
Предположим, у меня есть список, содержащий переменные группировки, которые я хочу передать в каждом вызове функции. Предположим также, что для каждого из этих элементов списка есть отдельное поле с идентификатором, описывающим группировку, которая была выполнена. Ниже приведен пример:
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")))
Как динамически передать эти списки аргументов / переменных и идентификаторов в вызовы функций и успешно ли они оцениваться с помощью dplyr? Допустим, я хочу создать столбец в результирующем фрейме данных, который помимо суммированных данных также содержит group_ids. Например, если мои group_vars
были c("grouping_var1", "grouping_var2")
, а group_ids
был "var_1_2"
для специфического c вызова функции, я бы ожидал вывод:
# 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_
функций, которые принимают строки.
В заключение я чувствую, что довольно обескураживает, что программирование с использованием dplyr в функциях с использованием NSE имеет такой барьер для входа. Каждый раз, когда я зацикливаюсь на чем-то простом, поиск решения занимает часы.