使用预引号参数在同一函数中使用 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) })
}
我有一个有点复杂的函数,有很多参数。没有过多的细节 - 它使用 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) })
}