Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename only if field exists, otherwise ignore

Tags:

r

dplyr

One can rename a field:

mtcars %>% rename(bla = mpg)

But if the field doesn't exist, an error:

    mtcars %>% rename(MPG = mpg, CYL = cyl, bla = uyhgfrtgf)
Error: Can't rename columns that don't exist.
x Column `uyhgfrtgf` doesn't exist

I looked at ?rename_if and it says this is now superseded by rename_with().

What's the 'right' way to attempt to rename fields but with a possibility they don't exist (e.g. in this case a ShinyApp with filter selectors).

like image 904
Doug Fir Avatar asked Aug 28 '21 15:08

Doug Fir


People also ask

How do you rename a variable in SAS?

There may be occasions in which you want to change some of the variable names in your SAS data set. To do so, you'll want to use the RENAME= option. As its name suggests, the RENAME= option allows you to change the variable names within a SAS data set. RENAME = (old1=new1 old2=new2 ....

What is the purpose of a rename statement in a data step?

The RENAME statement enables you to change the names of one or more variables, variables in a list, or a combination of variables and variable lists. The new variable names are written to the output data set only. Use the old variable names in programming statements for the current DATA step.

How do I rename multiple columns in R?

To change multiple column names by name and by index use rename() function of the dplyr package and to rename by just name use setnames() from data. table . From R base functionality, we have colnames() and names() functions that can be used to rename a data frame column by a single index or name.

How do I rename a column in dplyr?

rename() function from dplyr takes a syntax rename(new_column_name = old_column_name) to change the column from old to a new name. The following example renames the column from id to c1 . The operator – %>% is used to load the renamed column names to the data frame.


3 Answers

Use any_of() with a named vector. any_of() doesn't error if a variable isn't found.

library(dplyr)

lookup <- c(MPG = "mpg", CYL = "cyl", bla = "uyhgfrtgf")

mtcars %>%
   rename(any_of(lookup))

                   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
...
like image 155
Ritchie Sacramento Avatar answered Oct 17 '22 12:10

Ritchie Sacramento


I'm pretty sure you can do this with NSE but I can't handle this (yet?).

So you could define a lookup variable first:

lookup <- c("mpg" = "MPG", "cyl" = "CYL", "uyhgfrtgf" = "bla")

Attention: it's the other way round as in your rename function.

Now you could use

library(dplyr)

df %>% 
  rename_with(.fn = ~lookup[.x], .cols = intersect(names(.), names(lookup)))

which returns

                     MPG CYL  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
like image 10
Martin Gal Avatar answered Oct 17 '22 12:10

Martin Gal


We may use

library(dplyr)
lookup <-c("MPG" = "mpg", "CYL" = "cyl", "bla" = "uyhgfrtgf")
mtcars %>% 
    rename(!!! lookup[names(.) %in% lookup])
                     MPG CYL  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
...
like image 7
akrun Avatar answered Oct 17 '22 13:10

akrun