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

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> 

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

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

11

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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.