将行名称转换为第一列


147

我有一个像这样的数据框:

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)

有没有一行可以做到这一点?



12
您不需要额外的程序包,这里是d <- cbind(rownames(d), data.frame(d, row.names=NULL))
单线

@ ssp3nc3r的评论应为可接受的答案
Hrant

Answers:


119

你可以删除行名称,并将其转换为一列引用(不重新分配使用内存->)使用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

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


5
colnames(df)[1] <- "newname"如有必要,使用来重命名第一列。
Swetabh's

5
@Swetabh好吧,不。setnames(df, 1, "newname")data.table这样。
大卫·阿伦堡

@DavidArenburg好吧,(至少)现在您可以在同一电话中这样做setDT(df, keep.rownames = "newname")[]
sindri_baldur

1
在文档中的@DavidArenburg中as.data.table()::如果为TRUE,则将输入对象的名称添加为名为“ rn”的单独列。keep.rownames =“ id”改为将该列命名为“ id”
sindri_baldur

1
@snoram很好找到,我将为此做一个公关以使文档一致。
大卫·阿伦堡

140

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

library(dplyr)
df <- tibble::rownames_to_column(df, "VALUE")

更新(2016年中):(并入上文)

旧的调用函数add_rownames()已被弃用,并被替换tibble::rownames_to_column()(相同的函数,但Hadl​​ey进行dplyr了一些重构)。


14
完全一样,因为它不是通过引用来完成的:)
David Arenburg

1
更新:dplyr更新需要使用tibble :: rownames_to_column(),因为不建议使用dplyr :: rownames。
EDennis,

如果有人希望留在tidyverse内,那就太好了
Euler_Salter '19

83

单行选项是:

df$names <- rownames(df)

12
我希望您知道以下事实:它rownames最后添加为一列,实际上不是第一列。
阿加兹·侯赛因

30

另外,您可以创建一个新的数据框(或覆盖当前数据框,如下例所示),因此您无需使用任何外部包。但是,这种方法对于大型数据帧可能无效。

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

10
或:df <- cbind(names = rownames(df), df)
Mark Miller

15

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

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

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

4

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


2
@HectorHaffenden已为海报编辑了此内容,因为它实际上是一个不错的建议。
Tjebo,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.