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?



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.


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


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)

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)

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

4

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


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

2

Atau dengan menggunakan DBIssqlRownamesToColumn

library(DBI)
sqlRownamesToColumn(df)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.