Ubah nilai dalam kolom menjadi nama baris dalam bingkai data yang sudah ada di R.

108

Saya ingin mengubah nilai dalam kolom dari bingkai data yang ada menjadi nama baris. Apakah mungkin untuk melakukan ini tanpa mengekspor bingkai data dan kemudian mengimpornya kembali dengan row.names =panggilan?

Misalnya saya ingin mengonversi:

 > samp 
     names Var.1 Var.2 Var.3
 1     A     1     5     0
 2     B     2     4     1
 3     C     3     3     2
 4     D     4     2     3
 5     E     5     1     4

ke:

> samp.with.rownames 
     Var.1 Var.2 Var.3
A     1     5     0
B     2     4     1
C     3     3     2
D     4     2     3
E     5     1     4

Terima kasih

DQdlM
sumber

Jawaban:

135

Ini harus dilakukan:

samp2 <- samp[,-1]
rownames(samp2) <- samp[,1]

Jadi singkatnya, tidak ada alternatif untuk penugasan ulang.

Edit: Memperbaiki diri sendiri, Anda juga dapat melakukannya di tempat: tetapkan atribut rowname, lalu hapus kolom:

R> df<-data.frame(a=letters[1:10], b=1:10, c=LETTERS[1:10])
R> rownames(df) <- df[,1]
R> df[,1] <- NULL
R> df
   b c
a  1 A
b  2 B
c  3 C
d  4 D
e  5 E
f  6 F
g  7 G
h  8 H
i  9 I
j 10 J
R> 
Dirk Eddelbuettel
sumber
4
> rownames (df) <- df [, 1] Error in row.names<-.data.frame( *tmp*, value = value): panjang 'row.names' tidak valid Selain itu: Pesan peringatan: Menyetel nama baris pada tibble sudah tidak digunakan lagi.
pengguna3673
36

Mulai 2016, Anda juga dapat menggunakan tidyverse.

library(tidyverse)
samp %>% remove_rownames %>% column_to_rownames(var="names")
Joe
sumber
1
Lebih khusus lagi, initibble::column_to_rownames
Ott Toomet
1
Saya mendapat peringatan "Menetapkan nama baris di tibble sudah tidak digunakan lagi"
Quantum7
1
visualisasi tibble tidak menampilkan nama domain, untuk melihatnya Anda perlu menyalurkannya ke as.data.frame ()samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo
22

dalam satu baris

> samp.with.rownames <- data.frame(samp[,-1], row.names=samp[,1])
orang negro
sumber
11

Anda dapat menjalankan ini dalam 2 pernyataan sederhana:

row.names(samp) <- samp$names
samp[1] <- NULL
victor8910
sumber
Bekerja di R 3.5.3
TheSciGuy
5

Sepertinya one-liner menjadi lebih sederhana (saat ini menggunakan R 3.5.3):

# generate original data.frame
df <- data.frame(a = letters[1:10], b = 1:10, c = LETTERS[1:10])
# use first column for row names
df <- data.frame(df, row.names = 1)

Kolom yang digunakan untuk nama baris dihapus secara otomatis.

stragu
sumber