Agaz Wani
Agaz Wani

Reputation: 5694

How can I convert row names into the first column?

I have a data frame like this:

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" 

I want to convert the row names into the first column. Currently I use something like this to make row names as the first column:

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

Is there a single line to do this?

Upvotes: 242

Views: 470549

Answers (9)

hrbrmstr
hrbrmstr

Reputation: 78842

Or you can use tibble's rownames_to_column which does the same thing as David's answer:

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

Note: The earlier function called add_rownames() has been deprecated and is being replaced by tibble::rownames_to_column()

Upvotes: 253

Yale Liu
Yale Liu

Reputation: 131

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

Upvotes: 4

marianthi
marianthi

Reputation: 79

Change data rownames as a real column

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

Upvotes: 7

SteveS
SteveS

Reputation: 4070

dplyr::as_tibble(df, rownames = "your_row_name") will give you even simpler result.

Upvotes: 9

Agaz Wani
Agaz Wani

Reputation: 5694

Or by using DBIs sqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)

Upvotes: 3

ssp3nc3r
ssp3nc3r

Reputation: 3822

Moved my comment into an answer per suggestion above:

You don't need extra packages, here's a one-liner:

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

Upvotes: 37

David Arenburg
David Arenburg

Reputation: 92300

You can both remove row names and convert them to a column by reference (without reallocating memory using ->) using setDT and its keep.rownames = TRUE argument from the data.table package

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

As mentioned by @snoram, you can give the new column any name you want, e.g. setDT(df, keep.rownames = "newname") would add "newname" as the rows column.

Upvotes: 168

Emily
Emily

Reputation: 1279

A one line option is :

df$names <- rownames(df)

Upvotes: 122

drasc
drasc

Reputation: 537

Alternatively, you can create a new dataframe (or overwrite the current one, as the example below) so you do not need to use of any external package. However this way may not be efficient with huge dataframes.

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

Upvotes: 41

Related Questions