R: rename subset of variables in data frame

后端 未结 5 2103
醉梦人生
醉梦人生 2020-12-21 15:02

I\'m renaming the majority of the variables in a data frame and I\'m not really impressed with my method.

Therefore, does anyone on SO have a smarter or faster way t

相关标签:
5条回答
  • 2020-12-21 15:20

    You could use the rename.vars function in the gdata package. It works well when you only want to replace a subset of variable names and where the order of your vector of names is not the same as the order of names in the 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"
    

    I.e., Note how this handles the subsetting and the fact that string of names are not in the same order as the names in the data.frame.

    0 讨论(0)
  • 2020-12-21 15:24

    Edited for answer using base R only

    The package plyr has a convenient function rename() that does what you ask. Your modified question specifies using base R only. One easy way of doing 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 function rename takes an argument that is a named vector, where the elements of the vectors are the new names, and the names of the vector are the existing names. There are many ways to construct such a named vector. In the example below I simply 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)
    

    The 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 ...
    
    0 讨论(0)
  • 2020-12-21 15:25

    I would use ifelse:

    names(temp.mtcars) <- ifelse(names(mtcars) %in% c("mpg", "cyl", "disp"),
                                 names(mtcars),
                                 paste("bar", names(mtcars), sep = "."))
    
    0 讨论(0)
  • 2020-12-21 15:37

    Nearly 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 ...
    
    0 讨论(0)
  • 2020-12-21 15:37
    names(df)[match(
                    c('old_var1','old_var2'),
                    names(df)
                   )]=c('new_var1', 'new_var2')
    
    0 讨论(0)
提交回复
热议问题