使用预引号参数在同一函数中使用 dplyr 和 plyr 对数据框进行分组

Grouping a data frame with dplyr and plyr within the same function using prequoted arguments

我有一个有点复杂的函数,有很多参数。没有过多的细节 - 它使用 dplyr 和 plyr 对 data.frame 和 returns a 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) })

但是,如果参数值为 a、b、c,我如何在函数中获取 c("a"、"b"、"c")?

请不要使用 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) })
}