Ubah nama baris menjadi kolom pertama

154

Saya memiliki bingkai data seperti ini:

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" 

Saya ingin mengubah nama baris menjadi kolom pertama. Saat ini saya menggunakan sesuatu seperti ini untuk membuat nama baris sebagai kolom pertama:

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

Apakah ada satu baris untuk melakukan ini?

Agaz Wani
sumber
12
Anda tidak memerlukan paket tambahan, ini satu baris:d <- cbind(rownames(d), data.frame(d, row.names=NULL))
ssp3nc3r
Komentar oleh @ ssp3nc3r harus menjadi jawaban yang diterima
Hrant

Jawaban:

123

Anda berdua dapat menghapus nama baris dan mengubahnya menjadi kolom dengan referensi (tanpa mengalokasikan kembali memori menggunakan ->) menggunakan setDTdan keep.rownames = TRUEargumennya dari data.tablepaket

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

Seperti yang disebutkan oleh @snoram, Anda dapat memberi kolom baru nama apa pun yang Anda inginkan, misalnya setDT(df, keep.rownames = "newname")menambahkan "nama baru" sebagai kolom baris.

David Arenburg
sumber
5
Gunakan colnames(df)[1] <- "newname"untuk mengganti nama kolom pertama jika diperlukan.
Swetabh
5
@Swetabh Nah, tidak. setnames(df, 1, "newname")adalah data.tablejalannya.
David Arenburg
@DavidArenburg Nah, (setidaknya) sekarang Anda bisa melakukannya di panggilan yang samasetDT(df, keep.rownames = "newname")[]
sindri_baldur
1
@DavidArenburg ditemukan dalam dokumentasi untuk as.data.table(): Jika BENAR, tambahkan nama objek input sebagai kolom terpisah bernama "rn". keep.rownames = "id" menamai kolom "id" sebagai gantinya
sindri_baldur
1
@snoram temuan bagus, saya akan membuat PR tentang itu untuk membuat dokumen konsisten.
David Arenburg
146

Atau Anda dapat menggunakan dplyr's add_rownamesyang melakukan hal yang sama dengan jawaban David:

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

UPDATE (pertengahan 2016): (digabungkan dengan yang di atas)

fungsi lama yang dipanggil add_rownames()sudah tidak digunakan lagi dan digantikan oleh tibble::rownames_to_column()(fungsi yang sama, tapi Hadley dplyrsedikit di- refactored ).

hrbrmstr
sumber
14
Tidak persis sama, karena tidak melakukannya dengan referensi :)
David Arenburg
1
PEMBARUAN: pembaruan dplyr membutuhkan seseorang untuk menggunakan tibble :: rownames_to_column () karena dplyr :: rownames tidak digunakan lagi.
EDennnis
Ini bagus jika seseorang ingin tetap berada dalam tidyverse
Euler_Salter
86

Opsi satu baris adalah:

df$names <- rownames(df)
Emily
sumber
16
Saya harap Anda mengetahui fakta bahwa itu ditambahkan rownamessebagai kolom pada akhirnya, memang bukan sebagai kolom pertama.
Agaz Wani
31

Sebagai alternatif, Anda dapat membuat kerangka data baru (atau menimpa yang sekarang, seperti contoh di bawah) sehingga Anda tidak perlu menggunakan paket eksternal apa pun. Namun cara ini mungkin tidak efisien dengan kerangka data yang besar.

df <- data.frame(names = row.names(df), df)
drasc
sumber
10
Atau:df <- cbind(names = rownames(df), df)
Mark Miller
16

Memindahkan komentar saya menjadi jawaban per saran di atas:

Anda tidak memerlukan paket tambahan, ini satu baris:

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

dplyr::as_data_frame(df, rownames = "your_row_name") akan memberi Anda hasil yang lebih sederhana.

SteveS
sumber
2
@HectorHaffenden telah mengedit ini untuk poster, karena sebenarnya ini adalah saran yang bagus.
Tjebo
2

Atau dengan menggunakan DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Agaz Wani
sumber