将行名称转换为第一列

Aga*_*ain 114 r col dataframe rowname

我有一个这样的数据框:

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" 
Run Code Online (Sandbox Code Playgroud)

我想将行名称转换为第一列.目前我使用类似的东西将行名称作为第一列:

  d <- df
  names <- rownames(d)
  rownames(d) <- NULL
  data <- cbind(names,d)
Run Code Online (Sandbox Code Playgroud)

这样做有一条线吗?

hrb*_*str 112

或者你可以使用dplyradd_rownames该做同样的事情,大卫的回答:

library(dplyr)
df <- tibble::rownames_to_column(df, "VALUE")
Run Code Online (Sandbox Code Playgroud)

更新(2016年中):

add_rownames()已被弃用并被替换为tibble::rownames_to_column()(相同的功能,但哈德利重构dplyr了一下).

  • 不*完全*相同,因为它不是通过引用*:) (14认同)
  • 更新: dplyr 更新需要使用 tibble::rownames_to_column() ,因为 dplyr::rownames 已弃用。 (5认同)

Dav*_*urg 102

您可以删除行的名称,并将其转换为一列引用(不重新分配使用内存->)使用setDTkeep.rownames = TRUE从参数data.table

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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果需要,使用``colnames(df)[1] < - "newname"``重命名第一列. (5认同)
  • @Swetabh嗯,没有.`setnames(df,1,"newname")`是`data.table`方式. (5认同)
  • @snoram 很好的发现,我将对此进行 PR 以使文档保持一致。 (2认同)

小智 72

一行选项是:

df$names <- rownames(df)
Run Code Online (Sandbox Code Playgroud)

  • 我希望你知道它在最后添加`rownames`作为一个列,实际上不是第一列. (7认同)
  • 这与OP已经尝试过的有什么不同?他们已经知道了"rownames",不是吗?他们想把它放在开头. (7认同)
  • 删除索引后使用 `rownames(df) &lt;- NULL` (2认同)

dra*_*asc 21

或者,您可以创建一个新的数据帧(或覆盖当前的数据帧,如下例所示),这样您就不需要使用任何外部包.但是,对于庞大的数据帧,这种方式可能效率不高.

df <- data.frame(names = row.names(df), df)
Run Code Online (Sandbox Code Playgroud)

  • 或者:`df < - cbind(names = rownames(df),df)` (3认同)

Ste*_*veS 7

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

  • “`as_data_frame()` 在 tibble 2.0.0 中已弃用。请改用 `as_tibble()`。” 否则这是我最喜欢的。 (3认同)
  • @HectorHaffenden 已经为海报编辑了这个,因为这实际上是一个很好的建议。 (2认同)

ssp*_*c3r 6

根据以上建议,将我的评论移至答案中:

您不需要额外的程序包,这是一个单行代码:

d <- cbind(rownames(d), data.frame(d, row.names=NULL))
Run Code Online (Sandbox Code Playgroud)


小智 5

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

data <- data %>%
  rownames_to_column(var="the name you want")
Run Code Online (Sandbox Code Playgroud)