Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selectively Rename R Data Frame Column Names Using a Key, Value Pair Dictionary

Tags:

dataframe

r

I know there's an easy way to do this but I can't remember how I did it and can't find my notes. Basically I have a data frame with a bunch of column names. I also have a key,value pair data frame that has some new column names that need to replace the existing ones. I want to rename all of the columns that have a pair (and none that don't). So for example we can use mtcars:

x<-mtcars
idkey <- data.frame("original" =  c("cyl","hp"), "new" = c("cylinder", "horsepower"))
> head(x)
                   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

> idkey
  original        new
1      cyl   cylinder
2       hp horsepower

I just want to replace the column names in x that exist in idkey. So after the replacement names(x) will go from this

> names(x)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

to this:

> names(x)
 [1] "mpg"  "cylinder"  "disp" "horsepower"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

Note I would need this to only rename the columns which exist in the key, so some columns may not get renamed and they wouldn't be in any particular order.

like image 470
bhffs Avatar asked Dec 12 '19 23:12

bhffs


People also ask

Is it possible to rename column names in R?

As R user you will agree: To rename column names is one of the most often applied data manipulations in R. However, depending on your specific data situation, a different R syntax might be needed. Do you need to change only one column name in R? Would you like to rename all columns of your data frame?

How to rename a column in a data frame?

The columns of the data frame can be renamed by specifying the new column names as a vector. The new name replaces the corresponding old name of the column in the data frame. The length of new column vector should be equivalent to the number of columns originally. Changes are made to the original data frame. 6 <NA> 20.0 NA

How to replace a value in a data frame in R?

You can use the following syntax to replace a particular value in a data frame in R with a new value: df [df == 'Old Value'] <- 'New value' You can use the following syntax to replace one of several values in a data frame with a new value: df [df == 'Old Value 1' | df == 'Old Value 2'] <- 'New value'

What happens when you change the name of a column vector?

The new name replaces the corresponding old name of the column in the data frame. The length of new column vector should be equivalent to the number of columns originally. Changes are made to the original data frame.


3 Answers

dplyr::recode would also work:

colnames(x) <- dplyr::recode(
  colnames(x), 
  !!!setNames(as.character(idkey$new), idkey$original)
)
like image 58
Baurice Avatar answered Oct 15 '22 11:10

Baurice


In this case, rename_at would be useful. Specify the variables to be renamed inside the vars from the 'original' column of 'idkey' (the columns are factor - so convert to character class with as.character - because the data.frame default option is stringsAsFactors = TRUE)

library(dplyr)
x %>%
    rename_at(vars(as.character(idkey$original)), ~ as.character(idkey$new)) %>%
    head(2)
#             mpg cylinder disp horsepower drat    wt  qsec vs am gear carb
#Mazda RX4      21        6  160        110  3.9 2.620 16.46  0  1    4    4
#Mazda RX4 Wag  21        6  160        110  3.9 2.875 17.02  0  1    4    4
like image 29
akrun Avatar answered Oct 15 '22 13:10

akrun


We can use match in base R

names(x)[match(idkey$original, names(x))] <- idkey$new
head(x)

#                   mpg cylinder disp horsepower 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

data

x<-mtcars
idkey <- data.frame("original" =  c("cyl","hp"), 
                    "new" = c("cylinder", "horsepower"), stringsAsFactors = FALSE)
like image 40
Ronak Shah Avatar answered Oct 15 '22 13:10

Ronak Shah