tibble mutate_all multiple fields columns column change r sorting parameter-passing dplyr

mutate_all - Pase un vector de nombres de variables para organizar() en dplyr



select fields dplyr (4)

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

df <- structure(list(var1 = c(1L, 2L, 2L, 3L, 1L, 1L, 3L, 2L, 4L, 4L ), var2 = structure(c(10L, 1L, 8L, 3L, 5L, 4L, 7L, 9L, 2L, 6L ), .Label = c("b", "c", "f", "h", "i", "o", "s", "t", "w", "x" ), class = "factor"), var3 = c(7L, 5L, 5L, 8L, 5L, 8L, 6L, 7L, 5L, 8L), var4 = structure(c(8L, 5L, 1L, 4L, 7L, 4L, 3L, 6L, 9L, 2L), .Label = c("b", "c", "d", "e", "f", "h", "i", "w", "y"), class = "factor")), .Names = c("var1", "var2", "var3", "var4"), row.names = c(NA, -10L), class = "data.frame") # this is the normal way to arrange df with dplyr df %>% arrange(var3, var4) # but none of these (below) work for passing a vector of variables vector_of_vars <- c("var3", "var4") df %>% arrange(vector_of_vars) df %>% arrange(get(vector_of_vars)) df %>% arrange(eval(parse(text = paste(vector_of_vars, collapse = ", "))))


En el espíritu quosures:

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

Para una sola variable, se vería como:

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


En la nueva versión (que pronto será lanzada 0.6.0 de dplyr ) podemos hacer uso de los 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 . Los quos devolverán una list de variables citadas y dentro de la arrange , ¡¡¡no cotizamos la list usando !!! Para evaluar


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

Si entiendo su problema correctamente, puede 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 ==============

El uso de las versiones de evaluación estándar en dplyr como he mostrado aquí ahora se considera obsoleto . Puedes leer la viñeta de programación de Hadley para la nueva forma. Básicamente lo usarás !! para quitar una cita de una variable o !!! para cancelar la cotización de un vector de variables dentro de arrange() .

Cuando pase esas columnas, si están vacías, cítelas usando quo() para una variable o quos() para un vector. No utilice comillas. Ver la respuesta por Akrun.

Si sus columnas ya son cadenas, entonces rlang::sym() nombres 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. Lamentablemente, al momento de escribir este artículo, la información sobre cómo usar rlang::sym() aún no se ha rlang::sym() en la viñeta a la que estoy vinculado anteriormente (eventualmente estará en la sección sobre "quasiquotación variadica" según su borrador).


Prueba esto:

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

y en realidad esto se puede escribir 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.