Rename colums with tidyverse using environment variables

Viewed 142

I want to rename() some variables in my data programmatically, so I can to it via map at some point.

I'm looking for the equivalent of,

library(tidyverse)

mtcars %>% rename(
        "MPG" = "mpg"
)

but using environment variables instead. I tried !!sym() by doing the following,

library(tidyverse)

new_name <- "MPG"
old_name <- "mpg"

mtcars %>% rename(
        !!sym(new_name) = !!sym(old_name)
)

However, I get the error Error: unexpected ')' in ")". I am not sure what I am missing here!

2 Answers

We could use setNames and evaluate (!!!)

head(mtcars %>% 
     rename(!!! setNames(old_name, new_name)))

-output

                     MPG cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   6  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

You can use {{}} -

library(dplyr)

new_name <- "MPG"
old_name <- "mpg"

mtcars %>% rename({{new_name}} := {{old_name}}) %>% head

#                   MPG cyl disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
Related