R: rename a subset of variables in a data frame

I rename most of the variables in the data frame, and my method does not impress me.

Therefore, does anyone from SO have a smarter or faster way than the one presented below, using only the base?

data(mtcars) # head(mtcars) temp.mtcars <- mtcars names(temp.mtcars) <- c((x <- c("mpg", "cyl", "disp")), gsub('^', "baR.", setdiff(names (mtcars),x))) str(temp.mtcars) 'data.frame': 32 obs. of 11 variables: $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl : num 6 6 4 6 8 6 8 4 4 6 ... $ disp : num 160 160 108 258 360 ... $ baR.hp : num 110 110 93 110 175 105 245 62 95 123 ... $ baR.drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... $ baR.wt : num 2.62 2.88 2.32 3.21 3.44 ... $ baR.qsec: num 16.5 17 18.6 19.4 17 ... $ baR.vs : num 0 0 1 1 0 1 0 1 1 1 ... $ baR.am : num 1 1 1 0 0 0 0 0 0 0 ... $ baR.gear: num 4 4 4 3 3 3 3 4 4 4 ... $ baR.carb: num 4 4 1 1 2 1 4 2 2 4 ... 
+2
source share
5 answers

I would use ifelse :

 names(temp.mtcars) <- ifelse(names(mtcars) %in% c("mpg", "cyl", "disp"), names(mtcars), paste("bar", names(mtcars), sep = ".")) 
+3
source

Edited to answer using only the R base

The plyr package has a handy rename() function that does what you ask for. Your modified question only indicates the use of the R base. One easy way to do this is to simply copy the code from plyr::rename and create your own function.

 rename <- function (x, replace) { old_names <- names(x) new_names <- unname(replace)[match(old_names, names(replace))] setNames(x, ifelse(is.na(new_names), old_names, new_names)) } 

The rename function takes an argument, which is a named vector, where the elements of the vectors are the new names, and the vector names are the existing names. There are many ways to create such a named vector. In the example below, I just use structure .

 x <- c("mpg", "disp", "wt") some.names <- structure(paste0("baR.", x), names=x) some.names mpg disp wt "baR.mpg" "baR.disp" "baR.wt" 

Now you are ready to rename:

 mtcars <- rename(mtcars, replace=some.names) 

Results:

 'data.frame': 32 obs. of 11 variables: $ baR.mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl : num 6 6 4 6 8 6 8 4 4 6 ... $ baR.disp: num 160 160 108 258 360 ... $ hp : num 110 110 93 110 175 105 245 62 95 123 ... $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... $ baR.wt : num 2.62 2.88 2.32 3.21 3.44 ... $ qsec : num 16.5 17 18.6 19.4 17 ... $ vs : num 0 0 1 1 0 1 0 1 1 1 ... $ am : num 1 1 1 0 0 0 0 0 0 0 ... $ gear : num 4 4 4 3 3 3 3 4 4 4 ... $ carb : num 4 4 1 1 2 1 4 2 2 4 ... 
+7
source

Almost the same, but without plyr :

 data(mtcars) temp.mtcars <- mtcars carNames <- names(temp.mtcars) modifyNames <- !(carNames %in% c("mpg", "cyl", "disp")) names(temp.mtcars)[modifyNames] <- paste("baR.", carNames[modifyNames], sep="") 

Output:

 str(temp.mtcars) 'data.frame': 32 obs. of 11 variables: $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl : num 6 6 4 6 8 6 8 4 4 6 ... $ disp : num 160 160 108 258 360 ... $ baR.hp : num 110 110 93 110 175 105 245 62 95 123 ... $ baR.drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... $ baR.wt : num 2.62 2.88 2.32 3.21 3.44 ... $ baR.qsec: num 16.5 17 18.6 19.4 17 ... $ baR.vs : num 0 0 1 1 0 1 0 1 1 1 ... $ baR.am : num 1 1 1 0 0 0 0 0 0 0 ... $ baR.gear: num 4 4 4 3 3 3 3 4 4 4 ... $ baR.carb: num 4 4 1 1 2 1 4 2 2 4 ... 
+2
source

You can use the rename.vars function in the gdata package. It works well when you want to replace a subset of variable names and where the order of your name vector does not match the name order in data.frame.

Adapted from the help file:

 library(gdata) data <- data.frame(x=1:10,y=1:10,z=1:10) names(data) data <- rename.vars(data, from=c("z","y"), to=c("Z","Y")) names(data) 

Converts data.frame names:

 [1] "x" "y" "z" 

to

 [1] "x" "y" "z" 

Ie Notice how this handles the subset and the fact that the name string is not in the same order as the names in data.frame.

+1
source
 names(df)[match( c('old_var1','old_var2'), names(df) )]=c('new_var1', 'new_var2') 
0
source

All Articles