Konwertuj wartości w kolumnie na nazwy wierszy w istniejącej ramce danych w języku R.


108

Chciałbym przekonwertować wartości w kolumnie istniejącej ramki danych na nazwy wierszy. Czy można to zrobić bez eksportowania ramki danych, a następnie ponownego importowania jej za pomocą row.names =połączenia?

Na przykład chciałbym przekonwertować:

 > 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

w:

> 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

dzięki

Odpowiedzi:


135

To powinno wystarczyć:

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

Krótko mówiąc, nie ma alternatywy dla ponownego przypisania.

Edycja: Poprawiając siebie, można to również zrobić na miejscu: przypisać atrybuty rowname, a następnie usunąć kolumnę:

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> 

4
> rownames (df) <- df [, 1] Błąd w row.names<-.data.frame( *tmp*, wartość = wartość): nieprawidłowa długość „row.names” Ponadto: Komunikat ostrzegawczy: Ustawianie nazw wierszy w tibble jest przestarzałe.
user3673

36

Od 2016 r. Możesz również używać tidyverse.

library(tidyverse)
samp %>% remove_rownames %>% column_to_rownames(var="names")

1
Dokładniej, jest totibble::column_to_rownames
Ott Toomet

1
Otrzymuję ostrzeżenie „Ustawianie nazw wierszy w tibble jest przestarzałe”
Quantum7

1
wizualizacja tibble nie pokazuje jednak rownames, aby to zobaczyć, musisz ją potokować do as.data.frame ()samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo

22

w jednej linii

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

11

Możesz to zrobić za pomocą 2 prostych instrukcji:

row.names(samp) <- samp$names
samp[1] <- NULL

Działa w R 3.5.3
TheSciGuy

5

Wygląda na to, że jedna linijka stała się jeszcze prostsza na całej linii (obecnie używa 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)

Kolumna używana do nazw wierszy jest usuwana automatycznie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.