Pass a vector of variable names to arrange() in dplyr
Hadley hasn't made this obvious in the help file--only in his NSE vignette. The versions of the functions followed by underscores use standard evaluation, so you pass them vectors of strings and the like.
If I understand your problem correctly, you can just replace arrange()
with arrange_()
and it will work.
Specifically, pass the vector of strings as the .dots
argument when you do it.
> 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
========== Update March 2018 ==============
Using the standard evaluation versions in dplyr as I have shown here is now considered deprecated. You can read Hadley's programming vignette for the new way. Basically you will use !!
to unquote one variable or !!!
to unquote a vector of variables inside of arrange()
.
When you pass those columns, if they are bare, quote them using quo()
for one variable or quos()
for a vector. Don't use quotation marks. See the answer by Akrun.
If your columns are already strings, then make them names using rlang::sym()
for a single column or rlang::syms()
for a vector. See the answer by Christos. You can also use as.name()
for a single column. Unfortunately as of this writing, the information on how to use rlang::sym()
has not yet made it into the vignette I link to above (eventually it will be in the section on "variadic quasiquotation" according to his draft).
In the new version (soon to be released 0.6.0
of dplyr
) we can make use of the 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
When there are more than one variable, we use quos
and for a single variable it is quo
. The quos
will return a list
of quoted variables and inside arrange
, we unquote the list
using !!!
for evaluation