我的函数有些复杂,带有很多参数。无需过多介绍-它使用dplyr和plyr对data.frame进行了一些计算,并返回了一个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) })
}