How to add a row names to a data frame in a magrittr chain

前端 未结 4 1068
傲寒
傲寒 2021-01-13 10:49

I want to do the opposite of: Convert row names into first column

Somewhere down the chain of pipes I would like to add row names to the data frame, for example, I w

相关标签:
4条回答
  • 2021-01-13 11:03

    Other possibility is to use set_rownames alias from magrittr library.

    mtcars <- 
      mtcars %>%
      set_rownames(as.character(1:nrow(mtcars)))
    
    0 讨论(0)
  • 2021-01-13 11:05

    You can use row.names<-:

    mtcars <- mtcars %>% `row.names<-`(as.character(1:nrow(mtcars)))
    

    Should work. As a demo:

    df <- data.frame(x = 1:5, y = 2:6)
    df <- df %>% `row.names<-`(letters[1:5])
    df
    
    #   x y
    # a 1 2
    # b 2 3
    # c 3 4
    # d 4 5
    # e 5 6
    
    0 讨论(0)
  • 2021-01-13 11:08

    To actually "do the opposite of: Convert row names into first column" as stated at the top, i.e. turn a column of data into the row names, you'll want tibble::column_to_rownames(), which fits into pipes nicely. (I know your example specified something else, i.e. turning a sequence of numbers into the row names, for which you should use the other answers)

    library(tidyverse)
    starwars %>% column_to_rownames("name") %>% head()
    #>                height mass  hair_color  skin_color eye_color birth_year
    #> Luke Skywalker    172   77       blond        fair      blue       19.0
    #> C-3PO             167   75        <NA>        gold    yellow      112.0
    #> R2-D2              96   32        <NA> white, blue       red       33.0
    #> Darth Vader       202  136        none       white    yellow       41.9
    #> Leia Organa       150   49       brown       light     brown       19.0
    #> Owen Lars         178  120 brown, grey       light      blue       52.0
    #>                gender homeworld species
    #> Luke Skywalker   male  Tatooine   Human
    #> C-3PO            <NA>  Tatooine   Droid
    #> R2-D2            <NA>     Naboo   Droid
    #> Darth Vader      male  Tatooine   Human
    #> Leia Organa    female  Alderaan   Human
    #> Owen Lars        male  Tatooine   Human
    #>                                                                                                                                                    films
    #> Luke Skywalker                                           Revenge of the Sith, Return of the Jedi, The Empire Strikes Back, A New Hope, The Force Awakens
    #> C-3PO                             Attack of the Clones, The Phantom Menace, Revenge of the Sith, Return of the Jedi, The Empire Strikes Back, A New Hope
    #> R2-D2          Attack of the Clones, The Phantom Menace, Revenge of the Sith, Return of the Jedi, The Empire Strikes Back, A New Hope, The Force Awakens
    #> Darth Vader                                                                 Revenge of the Sith, Return of the Jedi, The Empire Strikes Back, A New Hope
    #> Leia Organa                                              Revenge of the Sith, Return of the Jedi, The Empire Strikes Back, A New Hope, The Force Awakens
    #> Owen Lars                                                                                          Attack of the Clones, Revenge of the Sith, A New Hope
    #>                                          vehicles                starships
    #> Luke Skywalker Snowspeeder, Imperial Speeder Bike X-wing, Imperial shuttle
    #> C-3PO                                                                     
    #> R2-D2                                                                     
    #> Darth Vader                                                TIE Advanced x1
    #> Leia Organa                 Imperial Speeder Bike                         
    #> Owen Lars
    

    Created on 2019-03-18 by the reprex package (v0.2.1)

    0 讨论(0)
  • 2021-01-13 11:14

    The tbl_df changes it to row number. So, we don't need to do any extra effort in changing row names.

    library(dplyr)
    tbl_df(mtcars)
    

    The same applies if we are using data.table

    as.data.table(mtcars)
    

    As the OP commented about changing the names to something other than the sequence of rows, if we use the same assignment showed in the other post

     mtcars %>%
         `row.names<-`(c(letters, LETTERS)[1:32]) %>%
          group_by(gear) %>%
          slice(1)
    #     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    #  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1  21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1
    #2  21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4
    #3  26.0     4 120.3    91  4.43 2.140 16.70     0     1     5     2
    

    As we can see, the row names changes to sequence again. So, if we change the row names to something else and do the dplyr chain operations, the previous change is worthless.

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