How can I convert row names into the first column?
Asked Answered
T

9

234

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?

Tertius answered 8/4, 2015 at 9:45 Comment(4)
possible duplicate of R: converting row names in multiple data frames to column in data frameCarboxylase
You don't need extra packages, here's a one-liner: d <- cbind(rownames(d), data.frame(d, row.names=NULL))Alphonsealphonsine
The comment by @Alphonsealphonsine should be an accepted answerDiscrepant
Even easier: d$names <- rownames(d)Base
U
244

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()

Unutterable answered 8/4, 2015 at 10:4 Comment(2)
Not exactly the same, because it's not doing it by reference :)Extine
This is great if one wants to stay within the tidyverseLinehan
E
165

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.

Extine answered 8/4, 2015 at 9:53 Comment(8)
Use colnames(df)[1] <- "newname" to rename the first column if needed.Blink
@Blink Well, no. setnames(df, 1, "newname") is the data.table way.Extine
@DavidArenburg Well, (at least) now you can do it in the same call setDT(df, keep.rownames = "newname")[]Burlington
@snoram to do what at the same call?Extine
@DavidArenburg setting the name from within the setDT() call - no need for setnames()Burlington
@snoram Interesting, I haven't seen it documented anywhereExtine
@DavidArenburg found in documentation for as.data.table(): If TRUE, adds the input object's names as a separate column named "rn". keep.rownames = "id" names the column "id" insteadBurlington
@snoram good find, I'll make a PR regarding that to make docs consistent.Extine
I
121

A one line option is :

df$names <- rownames(df)
Interment answered 18/3, 2016 at 12:21 Comment(4)
I hope you are aware of the fact that it adds rownames as a column at the last, indeed not as a first column.Tertius
After to remove index use rownames(df) <- NULLThunderstorm
@Thunderstorm - could you explain what does it mean by 'to remove index' as I see no difference to the data table before (df$names <- rownames(df)) and after (rownames(df) <- NULL). Do you mean it stores the index column internally?Oxytetracycline
@AravindanKalai Hi. rownames(df) <- NULL will remove original row names. I was referring to row names.Thunderstorm
E
40

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)
Evermore answered 30/3, 2017 at 17:55 Comment(1)
Or: df <- cbind(names = rownames(df), df)Shelve
A
33

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))
Alphonsealphonsine answered 27/3, 2019 at 13:43 Comment(0)
R
9

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

Risky answered 1/6, 2019 at 15:37 Comment(2)
@HectorHaffenden have edited this for the poster, because it's actually a nice suggestion.Manometer
"as_data_frame() was deprecated in tibble 2.0.0. Please use as_tibble() instead." Otherwise this is my favourite.Kurys
M
6

Change data rownames as a real column

data <- data %>%
  rownames_to_column(var="the name you want")
Mash answered 23/1, 2022 at 19:38 Comment(0)
S
4
df = data.frame(columnNameILike = row.names(df), df, row.names=NULL)
Sew answered 12/3, 2021 at 20:9 Comment(0)
T
3

Or by using DBIs sqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Tertius answered 22/11, 2019 at 22:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.