dplyr :: group_by_,带有几个变量名的字符串输入

tal*_*lat 23 r dplyr

我正在编写一个函数,要求用户在函数调用中定义一个或多个分组变量.然后使用dplyr对数据进行分组,如果只有一个分组变量,它会按预期工作,但我还没有想出如何使用多个分组变量.

例:

x <- c("cyl")
y <- c("cyl", "gear")
dots <- list(~cyl, ~gear)

library(dplyr)
library(lazyeval) 

mtcars %>% group_by_(x)             # groups by cyl
mtcars %>% group_by_(y)             # groups only by cyl (not gear)
mtcars %>% group_by_(.dots = dots)  # groups by cyl and gear, this is what I want.
Run Code Online (Sandbox Code Playgroud)

我试着变成ydots使用相同:

mtcars %>% group_by_(.dots = interp(~var, var = list(y)))
#Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE
Run Code Online (Sandbox Code Playgroud)

如何使用> 1个变量名的用户定义输入字符串(如y示例中所示)使用dplyr对数据进行分组?

(这个问题在某种程度上与这个有关,但在那里没有回答.)

Kon*_*lph 22

interp这里不需要,只需使用as.formula将字符串转换为公式:

dots = sapply(y, . %>% {as.formula(paste0('~', .))})
mtcars %>% group_by_(.dots = dots)
Run Code Online (Sandbox Code Playgroud)

您的interp方法不起作用的原因是表达式返回以下内容:

~list(c("cyl", "gear"))
Run Code Online (Sandbox Code Playgroud)

- 不是你想要的.当然,你可以sapply interp结束y,这与as.formula上面的使用类似:

dots1 = sapply(y, . %>% {interp(~var, var = .)})
Run Code Online (Sandbox Code Playgroud)

但是,事实上,你也可以直接通过y:

mtcars %>% group_by_(.dots = y)
Run Code Online (Sandbox Code Playgroud)

关于非标准评估dplyr小插图更详细,并解释了这些方法之间的差异.