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?
d <- cbind(rownames(d), data.frame(d, row.names=NULL))
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()
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.
colnames(df)[1] <- "newname"
to rename the first column if needed.
setnames(df, 1, "newname")
is the data.table
way.
setDT(df, keep.rownames = "newname")[]
as.data.table()
: If TRUE, adds the input object's names as a separate column named "rn". keep.rownames = "id" names the column "id" instead
A one line option is :
df$names <- rownames(df)
rownames
as a column at the last, indeed not as a first column.
rownames(df) <- NULL
rownames(df) <- NULL
will remove original row names. I was referring to row names.
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)
df <- cbind(names = rownames(df), df)
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))
dplyr::as_tibble(df, rownames = "your_row_name")
will give you even simpler result.
as_data_frame()
was deprecated in tibble 2.0.0. Please use as_tibble()
instead." Otherwise this is my favourite.
Or by using DBI
s sqlRownamesToColumn
library(DBI)
sqlRownamesToColumn(df)
df = data.frame(columnNameILike = row.names(df), df)
Change data rownames as a real column
data <- data %>%
rownames_to_column(var="the name you want")
Success story sharing