如何将行名称添加到 magrittr 链中的数据框
How to add a row names to a data frame in a magrittr chain
我想做相反的事情:
我想在管道链下的某处向数据框添加行名称,例如,我想使用管道执行以下操作:
rownames(mtcars) <- as.character(1:nrow(mtcars))
所以它看起来像:
library(magrittr)
mtcars <-
mtcars %>%
...???
请注意,@akrun 的回答表明,如果将管道与将数据帧强制转换为 tbl_df
的函数结合使用,行名称将会丢失。
您可以使用 row.names<-
:
mtcars <- mtcars %>% `row.names<-`(as.character(1:nrow(mtcars)))
应该可以。作为演示:
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
tbl_df
将其更改为行号。因此,我们不需要做任何额外的工作来更改行名称。
library(dplyr)
tbl_df(mtcars)
如果我们使用 data.table
,同样适用
as.data.table(mtcars)
正如 OP 评论的那样,将名称更改为行序列以外的名称,如果我们使用另一个 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
正如我们所见,行名再次更改为顺序。因此,如果我们将行名称更改为其他名称并进行 dplyr 链操作,则之前的更改毫无价值。
其他可能性是使用 magrittr
库中的 set_rownames
别名。
mtcars <-
mtcars %>%
set_rownames(as.character(1:nrow(mtcars)))
实际上 "do the opposite of: Convert row names into first column" 如顶部所述,即将一列数据转换为行名称,您需要 tibble::column_to_rownames()
,它非常适合管道。 (我知道您的示例指定了其他内容,即将数字序列转换为行名称,为此您应该使用其他答案)
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
由 reprex package (v0.2.1)
于 2019-03-18 创建
我想做相反的事情:
我想在管道链下的某处向数据框添加行名称,例如,我想使用管道执行以下操作:
rownames(mtcars) <- as.character(1:nrow(mtcars))
所以它看起来像:
library(magrittr)
mtcars <-
mtcars %>%
...???
请注意,@akrun 的回答表明,如果将管道与将数据帧强制转换为 tbl_df
的函数结合使用,行名称将会丢失。
您可以使用 row.names<-
:
mtcars <- mtcars %>% `row.names<-`(as.character(1:nrow(mtcars)))
应该可以。作为演示:
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
tbl_df
将其更改为行号。因此,我们不需要做任何额外的工作来更改行名称。
library(dplyr)
tbl_df(mtcars)
如果我们使用 data.table
as.data.table(mtcars)
正如 OP 评论的那样,将名称更改为行序列以外的名称,如果我们使用另一个 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
正如我们所见,行名再次更改为顺序。因此,如果我们将行名称更改为其他名称并进行 dplyr 链操作,则之前的更改毫无价值。
其他可能性是使用 magrittr
库中的 set_rownames
别名。
mtcars <-
mtcars %>%
set_rownames(as.character(1:nrow(mtcars)))
实际上 "do the opposite of: Convert row names into first column" 如顶部所述,即将一列数据转换为行名称,您需要 tibble::column_to_rownames()
,它非常适合管道。 (我知道您的示例指定了其他内容,即将数字序列转换为行名称,为此您应该使用其他答案)
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
由 reprex package (v0.2.1)
于 2019-03-18 创建