dplyr :: group_by_ con la entrada de cadena de caracteres de varios nombres de variables

Estoy escribiendo una función donde se le pide al usuario que defina una o más variables de agrupación en la llamada a la función. Los datos se agrupan luego usando dplyr y funciona como se espera si solo hay una variable de agrupación, pero no he descubierto cómo hacerlo con múltiples variables de agrupación.

Ejemplo:

x <- c("cyl") y <- c("cyl", "gear") dots % 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. 

Traté de convertir a y en lo mismo que usando dots :

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

¿Cómo usar una cadena de entrada definida por el usuario de> 1 nombre de variable (como y en el ejemplo) para agrupar los datos usando dplyr?

(Esta pregunta está relacionada de alguna manera con esta, pero no se responde allí).

No necesita interp aquí, solo use as.formula para convertir las cadenas en fórmulas:

 dots = sapply(y, . %>% {as.formula(paste0('~', .))}) mtcars %>% group_by_(.dots = dots) 

La razón por la cual su enfoque interp no funciona es que la expresión le devuelve lo siguiente:

 ~list(c("cyl", "gear")) 

– No es lo que quieres. Por supuesto, sapply interp sobre y , lo que sería similar al uso de la as.formula anterior:

 dots1 = sapply(y, . %>% {interp(~var, var = .)}) 

Pero, de hecho, también puede pasar directamente y :

 mtcars %>% group_by_(.dots = y) 

La viñeta dplyr sobre evaluación no estándar entra en más detalles y explica la diferencia entre estos enfoques.

slice_rows() del paquete purrrlyr ( https://github.com/hadley/purrrlyr ) agrupa un data.frame tomando un vector de nombres de columna (cadenas) o posiciones (enteros):

 y < - c("cyl", "gear") mtcars_grp <- mtcars %>% purrrlyr::slice_rows(y) class(mtcars_grp) #> [1] "grouped_df" "tbl_df" "tbl" "data.frame" group_vars(mtcars_grp) #> [1] "cyl" "gear" 

Particularmente útil ahora que group_by_() se ha depreciado.