Konvertieren Sie die Werte in einer Spalte in Zeilennamen in einem vorhandenen Datenrahmen in R.

108

Ich möchte die Werte in einer Spalte eines vorhandenen Datenrahmens in Zeilennamen konvertieren. Ist dies möglich, ohne den Datenrahmen zu exportieren und ihn dann mit einem row.names =Aufruf erneut zu importieren ?

Zum Beispiel möchte ich konvertieren:

 > 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

in:

> 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

Vielen Dank

DQdlM
quelle

Antworten:

135

Dies sollte tun:

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

Kurz gesagt, nein, es gibt keine Alternative zur Neuzuweisung.

Bearbeiten: Wenn ich mich korrigiere, kann man es auch an Ort und Stelle tun: Rowname-Attribute zuweisen, dann Spalte entfernen:

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
quelle
4
> rownames (df) <- df [, 1] Fehler in row.names<-.data.frame( *tmp*, value = value): ungültige 'row.names'-Länge Zusätzlich: Warnmeldung: Das Festlegen von Zeilennamen in einem Tibble ist veraltet.
user3673
36

Ab 2016 können Sie auch die tidyverse.

library(tidyverse)
samp %>% remove_rownames %>% column_to_rownames(var="names")
Joe
quelle
1
Genauer gesagt ist estibble::column_to_rownames
Ott Toomet
1
Ich erhalte die Warnung "Das Festlegen von Zeilennamen auf einem Tibble ist veraltet"
Quantum7
1
Die tibble-Visualisierung zeigt jedoch keine Rownamen an. Um sie zu sehen, müssen Sie sie an as.data.frame () weiterleitensamp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo
22

in einer Zeile

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

Sie können dies in 2 einfachen Anweisungen ausführen:

row.names(samp) <- samp$names
samp[1] <- NULL
victor8910
quelle
Funktioniert in R 3.5.3
TheSciGuy
5

Es sieht so aus, als wäre der Einzeiler auf der ganzen Linie noch einfacher geworden (derzeit wird R 3.5.3 verwendet):

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

Die für Zeilennamen verwendete Spalte wird automatisch entfernt.

stragu
quelle