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.
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?
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
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'
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.
dplyr::recode
would also work:
colnames(x) <- dplyr::recode(
colnames(x),
!!!setNames(as.character(idkey$new), idkey$original)
)
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
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With