Replacement for “rename” in dplyr

前端 未结 6 898
长情又很酷
长情又很酷 2020-12-02 05:51

I like plyr\'s renaming function rename. I have recently started using dplyr, and was wondering if there is an easy way to rename variables using a function fr

相关标签:
6条回答
  • 2020-12-02 06:04

    It is not listed as a function in dplyr (yet): http://cran.rstudio.org/web/packages/dplyr/dplyr.pdf

    The function below works (almost) the same if you don't want to load both plyr and dplyr

    rename <- function(dat, oldnames, newnames) {
      datnames <- colnames(dat)
      datnames[which(datnames %in% oldnames)] <- newnames
      colnames(dat) <- datnames
      dat
    }
    
    dat <- rename(mtcars,c("mpg","cyl"), c("mympg","mycyl"))
    head(dat)
    
                      mympg mycyl 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
    

    Edit: The comment by Romain produces the following (note that the changes function requires dplyr .1.1)

    > dplyr:::changes(mtcars, dat)
    Changed variables:
              old         new        
    disp      0x108b4b0e0 0x108b4e370
    hp        0x108b4b210 0x108b4e4a0
    drat      0x108b4b340 0x108b4e5d0
    wt        0x108b4b470 0x108b4e700
    qsec      0x108b4b5a0 0x108b4e830
    vs        0x108b4b6d0 0x108b4e960
    am        0x108b4b800 0x108b4ea90
    gear      0x108b4b930 0x108b4ebc0
    carb      0x108b4ba60 0x108b4ecf0
    mpg       0x1033ee7c0            
    cyl       0x10331d3d0            
    mympg                 0x108b4e110
    mycyl                 0x108b4e240
    
    Changed attributes:
              old         new        
    names     0x10c100558 0x10c2ea3f0
    row.names 0x108b4bb90 0x108b4ee20
    class     0x103bd8988 0x103bd8f58
    
    0 讨论(0)
  • 2020-12-02 06:09

    dplyr version 0.3 added a new rename() function that works just like plyr::rename().

    df <- rename(df, new_name = old_name)
    
    0 讨论(0)
  • 2020-12-02 06:10

    I tried to use dplyr::rename and I get an error:

    occ_5d <- dplyr::rename(occ_5d, rowname='code_5d')
    Error: Unknown column `code_5d` 
    Call `rlang::last_error()` to see a backtrace
    

    I instead used the base R function which turns out to be quite simple and effective:

    names(occ_5d)[1] = "code_5d"
    
    0 讨论(0)
  • 2020-12-02 06:11

    While not exactly renaming, dplyr::select_all() can be used to reformat column names. This example replaces spaces and periods with an underscore and converts everything to lower case:

    iris %>%  
      select_all(~gsub("\\s+|\\.", "_", .)) %>% 
      select_all(tolower) %>% 
      head(2)
      sepal_length sepal_width petal_length petal_width species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    
    0 讨论(0)
  • 2020-12-02 06:17

    The next version of dplyr will support an improved version of select that also incorporates renaming:

    > mtcars2 <- select( mtcars, disp2 = disp )
    > head( mtcars2 )
                      disp2
    Mazda RX4         160
    Mazda RX4 Wag     160
    Datsun 710        108
    Hornet 4 Drive    258
    Hornet Sportabout 360
    Valiant           225
    > changes( mtcars, mtcars2 )
    Changed variables:
          old         new
    disp  0x105500400
    disp2             0x105500400
    
    Changed attributes:
          old         new
    names 0x106d2cf50 0x106d28a98
    
    0 讨论(0)
  • 2020-12-02 06:21

    You can actually use plyr's rename function as part of dplyr chains. I think every function that a) takes a data.frame as the first argument and b) returns a data.frame works for chaining. Here is an example:

    library('plyr')
    library('dplyr')
    
    DF = data.frame(var=1:5)
    
    DF %>%
        # `rename` from `plyr`
        rename(c('var'='x')) %>%
        # `mutate` from `dplyr` (note order in which libraries are loaded)
        mutate(x.sq=x^2)
    
    #   x x.sq
    # 1 1    1
    # 2 2    4
    # 3 3    9
    # 4 4   16
    # 5 5   25
    

    UPDATE: The current version of dplyr supports renaming directly as part of the select function (see Romain Francois post above). The general statement about using non-dplyr functions as part of dplyr chains is still valid though and rename is an interesting example.

    0 讨论(0)
提交回复
热议问题