Convertir les valeurs d'une colonne en noms de lignes dans un bloc de données existant dans R

108

Je voudrais convertir les valeurs d'une colonne d'un bloc de données existant en noms de lignes. Est-il possible de le faire sans exporter la trame de données, puis la réimporter avec un row.names =appel?

Par exemple, je voudrais convertir:

 > 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

dans:

> 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

Merci

DQdlM
la source

Réponses:

135

Cela devrait faire:

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

Bref, non, il n'y a pas d'alternative à la réaffectation.

Edit: En me corrigeant, on peut aussi le faire en place: attribuer des attributs de nom de domaine, puis supprimer la colonne:

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
la source
4
> rownames (df) <- df [, 1] Erreur dans row.names<-.data.frame( *tmp*, value = value): longueur 'row.names' invalide En outre: Message d'avertissement: La définition des noms de ligne sur un tibble est obsolète.
user3673
36

Depuis 2016, vous pouvez également utiliser le tidyverse.

library(tidyverse)
samp %>% remove_rownames %>% column_to_rownames(var="names")
Joe
la source
1
Plus précisément, c'esttibble::column_to_rownames
Ott Toomet
1
Je reçois un avertissement "La définition des noms de ligne sur un tibble est obsolète"
Quantum7
1
La visualisation tibble n'affiche pas les noms de lignes, cependant, pour le voir, vous devez le diriger vers as.data.frame ()samp %>% remove_rownames %>% column_to_rownames(var="names") %>% as.data.frame()
Matteo
22

en une ligne

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

Vous pouvez l'exécuter en 2 instructions simples:

row.names(samp) <- samp$names
samp[1] <- NULL
victor8910
la source
Fonctionne dans R 3.5.3
TheSciGuy
5

Il semble que le one-liner soit devenu encore plus simple le long de la ligne (actuellement en utilisant 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)

La colonne utilisée pour les noms de ligne est supprimée automatiquement.

Stragu
la source