如何将行名称转换为第一列?

229
我有一个像这样的数据框:
df
              VALUE              ABS_CALL DETECTION P-VALUE    
    1007_s_at "957.729231881542" "P"      "0.00486279317241156"
    1053_at   "320.632701283368" "P"      "0.0313356324173416" 
    117_at    "429.842323161046" "P"      "0.0170004527476119" 
    121_at    "2395.7364289242"  "P"      "0.0114473584876183" 
    1255_g_at "116.493632746934" "A"      "0.39799368200131"   
    1294_at   "739.927122116896" "A"      "0.0668649772942343" 

我想将行名称转换为第一列。目前,我使用类似以下的方法将行名称作为第一列:

  d <- df
  names <- rownames(d)
  rownames(d) <- NULL
  data <- cbind(names,d)

有没有一行代码可以实现这个功能?


32
不需要额外的包,这是一个一行代码:d <- cbind(rownames(d), data.frame(d, row.names=NULL))。它的作用是将数据框d的行名与数据框合并,并创建一个新的数据框d。 - ssp3nc3r
1
@ssp3nc3r的评论应该被接受为答案。 - Hrant
更简单的方法:d$names <- rownames(d) - Dima
9个回答

233

或者您可以使用 tibblerownames_to_column,它与David的答案相同:

library(tibble)
df <- tibble::rownames_to_column(df, "VALUE")
注意:之前被称为add_rownames()的函数已经被弃用,正在被tibble::rownames_to_column()替代。

15
不完全相同,因为它没有通过引用执行。 :) - David Arenburg
5
更新:dplyr的更新要求使用tibble::rownames_to_column(),因为dplyr::rownames已被弃用。 - EDennnis
如果想要保持在tidyverse内部,这非常棒。 - Euler_Salter

161

您可以使用data.table软件包中的setDT和其keep.rownames = TRUE参数,通过引用同时删除行名称并将它们转换为列(而不需要使用->重新分配内存)。

library(data.table)
setDT(df, keep.rownames = TRUE)[]
#    rn     VALUE  ABS_CALL DETECTION     P.VALUE
# 1:  1 1007_s_at  957.7292         P 0.004862793
# 2:  2   1053_at  320.6327         P 0.031335632
# 3:  3    117_at  429.8423         P 0.017000453
# 4:  4    121_at 2395.7364         P 0.011447358
# 5:  5 1255_g_at  116.4936         A 0.397993682
# 6:  6   1294_at  739.9271         A 0.066864977

正如 @snoram 所提到的,您可以为新列指定任何名称,例如 setDT(df, keep.rownames = "newname") 将 "newname" 添加为行列。


5
如果需要,可以使用 colnames(df)[1] <- "newname" 来重命名第一列。 - Swetabh
5
@Swetabh 不是,setnames(df, 1, "newname")data.table 的方式。 - David Arenburg
1
@DavidArenburg 好的,(至少)现在你可以在同一个调用中完成它 setDT(df, keep.rownames = "newname")[] - s_baldur
1
@DavidArenburg 在 as.data.table() 的文档中发现:如果为TRUE,则将输入对象的名称作为名为“rn”的单独列添加。keep.rownames =“id”将该列命名为“id” - s_baldur
2
@snoram 发现得不错,我会提交一个 PR 来使文档保持一致。 - David Arenburg
显示剩余3条评论

118

一种单行选项是:

df$names <- rownames(df)

22
希望您知道的是,它将rownames添加为最后一列,而不是第一列。 - Agaz Wani
2
在删除索引后,使用rownames(df) <- NULL - vasili111
@vasili111 - 你能解释一下“删除索引”的意思吗?因为我在执行(df$names <- rownames(df))和(rownames(df) <- NULL)之前和之后看不到数据表的任何区别。你是说它在内部存储了索引列吗? - Aravindan Kalai
@AravindanKalai 你好。rownames(df) <- NULL会删除原始行名称。我是在提到行名称。 - vasili111

40

或者,您可以创建一个新的数据框(或覆盖当前数据框,如下面的示例)以避免使用任何外部包。但是,对于巨大的数据框来说,这种方法可能不够高效。

df <- data.frame(names = row.names(df), df)

20
这段代码的作用是将数据框 df 的行名称添加为一列,并赋值给 df。具体翻译如下: Or: df <- cbind(names = rownames(df), df) 意为:将 df 的行名称和原始数据框合并为一个新的数据框,并将其赋值给 df 变量。 - Mark Miller

31

根据上述建议,我将我的评论转为回答:

你不需要额外的包,这里是一行代码:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))

9

dplyr::as_tibble(df, rownames = "your_row_name")可以给你更简单的结果。


2
@HectorHaffenden已经为海报编辑过了,因为这实际上是一个不错的建议。 - tjebo
3
"as_data_frame()" еңЁ tibble 2.0.0 дёӯе·Іиў«ејғз”ЁпјҢиҜ·ж”№з”Ё "as_tibble()"гҖӮ"еҗҰеҲҷпјҢиҝҷжҳҜжҲ‘зҡ„жңҖзҲұгҖӮ" - Samuel Saari

4

将数据行名称更改为实际列

data <- data %>%
  rownames_to_column(var="the name you want")

3
df = data.frame(columnNameILike = row.names(df), df, row.names=NULL)

3

或者使用DBI中的sqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接