Группирование фрейма данных с помощью dplyr и plyr в одной и той же функции с использованием предварительно заключенных в кавычки аргументов - PullRequest
0 голосов
/ 24 октября 2019

У меня есть несколько сложная функция со многими аргументами. Не вдаваясь в подробности, он выполняет некоторые вычисления для data.frame с использованием dplyr и plyr и возвращает data.frame с несколькими прикрепленными столбцами результатов.

У меня есть аргумент для основной переменной группировки и ... для любых дополнительных групп. Я использую эти переменные группировки как с dplyr, так и с plyr.

Бит dplyr был довольно простым - я использовал enquo и !! без проблем. Но я не могу понять, как использовать те же принципы с plyr.

Работает с dplyr.

myfun <- function(data, main_group, ...) {
  group <- enquo(main_group)
  add_groups <- enquos(...)
  data %>%
    group_by(!! group, !!! add_groups)
}

mydata <- data.frame(a = 1:3, b = 1:3, c = 1:3, d = 1:3)
myfun(mydata, main_group = a, b, c)

Но не с plyr, и мне нужны оба.

myfun <- function(data, main_group, ...) {
  group <- enquo(main_group)
  add_groups <- enquos(...)
  ddply(data, .(!! group, !!! add_groups), .fun = function(X) { data.frame(result1 = 1, result2 = 1, result3 = 1) })
}
myfun(mydata, main_group = a, b, c)

Полагаю, было бы проще, если бы я мог использовать векторимен строковых переменных в вызове ddply.

ddply(mydata, c("a", "b", "c"), .fun = function(X) { data.frame(result1 = 1, result2 = 1, result3 = 1) })

Но как я могу получить c ("a", "b", "c") внутри функции, если значения аргумента a, b, c?

1 Ответ

0 голосов
/ 24 октября 2019

Пожалуйста, не используйте plyr, он вышел на пенсию и устарел. Для аналогичной функциональности, пожалуйста, см. purrr.

Однако я верю, что вы можете использовать deparse(substitute()) для решения вашей проблемы. Например,

myfun <- function(data, main_group, ...) {
  group <- deparse(substitute(main_group))
  add_groups <- as.character(as.list(match.call(expand.dots = FALSE)$...))
  ddply(data, c(group, add_groups), .fun = function(X) { data.frame(result1 = 1, result2 = 1, result3 = 1) })
}
...