Pase un vector de nombres de variables para arreglar () en dplyr

Quiero pasar arrange() {dplyr} un vector de nombres de variables para ordenar. Usualmente escribo las variables que quiero, pero estoy tratando de hacer una función donde las variables de clasificación se puedan ingresar como un parámetro de función.

 df % arrange(var3, var4) # but none of these (below) work for passing a vector of variables vector_of_vars % arrange(vector_of_vars) df %>% arrange(get(vector_of_vars)) df %>% arrange(eval(parse(text = paste(vector_of_vars, collapse = ", ")))) 

Hadley no lo ha hecho obvio en el archivo de ayuda, solo en su viñeta de NSE. Las versiones de las funciones seguidas de los guiones bajos utilizan una evaluación estándar, por lo que les pasa vectores de cadenas y elementos similares.

Si entiendo tu problema correctamente, puedes simplemente reemplazar arrange() con arrange_() y funcionará.

Específicamente, pase el vector de cadenas como el argumento .dots cuando lo haga.

 > df %>% arrange_(.dots=c("var1","var3")) var1 var2 var3 var4 1 1 i 5 i 2 1 x 7 w 3 1 h 8 e 4 2 b 5 f 5 2 t 5 b 6 2 w 7 h 7 3 s 6 d 8 3 f 8 e 9 4 c 5 y 10 4 o 8 c 

========== Actualización de marzo de 2018 ==============

Usar las versiones de evaluación estándar en dplyr como lo he mostrado aquí ahora se considera obsoleto . Puedes leer la viñeta de progtwigción de Hadley para la nueva forma. ¡Básicamente usarás !! para desmarcar una variable o !!! para unir un vector de variables dentro de arrange() .

Cuando pase esas columnas, si están vacías, citarlas usando quo() para una variable o quos() para un vector. No use comillas Vea la respuesta de Akrun.

Si sus columnas ya son cadenas, entonces haga que se rlang::sym() usando rlang::sym() para una sola columna o rlang::syms() para un vector. Vea la respuesta de Christos. También puede usar as.name() para una sola columna. Desafortunadamente al momento de escribir esto, la información sobre cómo usar rlang::sym() aún no ha llegado a la viñeta a la que me he vinculado anteriormente (eventualmente estará en la sección sobre “cuasiquotación variable” según su borrador).

En la nueva versión (próximamente lanzada 0.6.0 de dplyr ) podemos hacer uso de las quosures

 library(dplyr) vector_of_vars <- quos(var1, var3) df %>% arrange(!!! vector_of_vars) # var1 var2 var3 var4 #1 1 i 5 i #2 1 x 7 w #3 1 h 8 e #4 2 b 5 f #5 2 t 5 b #6 2 w 7 h #7 3 s 6 d #8 3 f 8 e #9 4 c 5 y #10 4 o 8 c 

Cuando hay más de una variable, usamos quos y para una sola variable es quo . El quos devolverá una list de las variables citadas y, dentro de arrange , podemos unir la list con !!! Para evaluar

En el espíritu quosures:

 df %>% arrange(!!! rlang::syms(c("var1", "var3"))) 

Para una sola variable, se vería así:

 df %>% arrange(!! rlang::sym(c("var1"))) 

Prueba esto:

 df %>% do(do.call(arrange_, . %>% list(.dots = vector_of_vars))) 

y en realidad esto puede escribirse más simplemente como:

 df %>% arrange_(.dots = vector_of_vars) 

aunque en este punto creo que es lo mismo que la solución implícita de farnsy.