Comment gérer les rownames dans R ?

Comment gérer les rownames dans R

Dans R, les rownames correspondent à des noms de lignes sur les data frames (tableaux de données).
Le plus souvent, les rownames sont simplement des numéros de lignes,  comme dans le jeu de données iris :

View(iris) 
Rownames sous la forme de nombre

Mais parfois certains jeux de données contiennent de “vrais” rownames ; c’est par exemple le cas des données decathlon présentes dans le package FactoMineR qui contiennent le nom des athlètes :

#install.packages("FactoMineR")
library(FactoMineR)
data(decathlon)
View(decathlon) 
Rownames avec le nom des athlètes

Les rownames sont ensuite utilisés dans les graphiques générés par certaines fonctions pour mettre des étiquettes sur les points. C’est le cas, par exemple de la fonction PCA() du package FactoMineR qui génère un plot des individus, et lorsque les rownames sont les noms des athlètes, cela permet de les identifier ensuite facilement :

library(FactoMineR)
plot.PCA(PCA(decathlon[,1:10]), choix=c("ind")) 
Utilisation des rownames sur le graph des individus de l'ACP

Lorsqu’on analyse des données dans R, il est parfois préférable d’avoir une information contenue dans des rownames, plutôt que dans une variable, et dans d’autres situations, c’est l’inverse : il est préférable d’avoir l’information dans une variable, plutôt que dans des rownames.

Il est donc important de savoir manipuler ces rownames.

Dans cet article, je vais vous montrer :

  • comment créer une variable à partir de rownames
  • comment créer des rownames à partir d’une variable
  • comment passer une variable en rownames directement au moment de l’importation
  • comment gérér les rownames lors de l’exportation

Table des matières

Créer une variable à partir de rownames

Pour cela, le plus facile est d’employer la fonction rownames_to_column() du package tibble (contenu dans le package tidyverse). Dans l’exemple ci-dessous, je crée un data frame nommé “decath” à  partir des données decathlon,  et en créant la variable “Athlet” à partir des rownames :

library(tidyverse)

decath <- decathlon %>% 
  rownames_to_column(var="Athlet")

head(decath)
##    Athlet  100m Long.jump Shot.put High.jump  400m 110m.hurdle Discus
## 1  SEBRLE 11.04      7.58    14.83      2.07 49.81       14.69  43.75
## 2    CLAY 10.76      7.40    14.26      1.86 49.37       14.05  50.72
## 3  KARPOV 11.02      7.30    14.77      2.04 48.37       14.09  48.95
## 4 BERNARD 11.02      7.23    14.25      1.92 48.93       14.99  40.87
## 5  YURKOV 11.34      7.09    15.19      2.10 50.42       15.31  46.26
## 6 WARNERS 11.11      7.60    14.31      1.98 48.68       14.23  41.10
##   Pole.vault Javeline 1500m Rank Points Competition
## 1       5.02    63.19 291.7    1   8217    Decastar
## 2       4.92    60.15 301.5    2   8122    Decastar
## 3       4.92    50.31 300.2    3   8099    Decastar
## 4       5.32    62.77 280.1    4   8067    Decastar
## 5       4.72    63.44 276.4    5   8036    Decastar
## 6       4.92    51.77 278.1    6   8030    Decastar 

La variable “Athlet” a été créé en première position.

Créer des rownames à partir d’une variable

On peut facilement réaliser la manipulation inverse, en employant la fonction column_to_rownames() :

decath2 <- decath %>% 
  column_to_rownames(var="Athlet")

head(decath2)
##          100m Long.jump Shot.put High.jump  400m 110m.hurdle Discus Pole.vault
## SEBRLE  11.04      7.58    14.83      2.07 49.81       14.69  43.75       5.02
## CLAY    10.76      7.40    14.26      1.86 49.37       14.05  50.72       4.92
## KARPOV  11.02      7.30    14.77      2.04 48.37       14.09  48.95       4.92
## BERNARD 11.02      7.23    14.25      1.92 48.93       14.99  40.87       5.32
## YURKOV  11.34      7.09    15.19      2.10 50.42       15.31  46.26       4.72
## WARNERS 11.11      7.60    14.31      1.98 48.68       14.23  41.10       4.92
##         Javeline 1500m Rank Points Competition
## SEBRLE     63.19 291.7    1   8217    Decastar
## CLAY       60.15 301.5    2   8122    Decastar
## KARPOV     50.31 300.2    3   8099    Decastar
## BERNARD    62.77 280.1    4   8067    Decastar
## YURKOV     63.44 276.4    5   8036    Decastar
## WARNERS    51.77 278.1    6   8030    Decastar 

Importer des données en passant directement une variable en rownames

Ici, les données “mydata” contiennent une variable “nom” que je souhaite passer en rownames directement au moment de l’importation :

données mydata

Pour passer la variable nom directement en rownames lors de l’importation, j’emploie l’argument row.names= de la fonction read.csv2(), comme ceci :

mydata <- read.csv2("data/mydata.csv", row.names="nom")
head(mydata)
##        maths francais anglais sciences histoire_geo
## tintin    15       12      16       11           18
## milou     14        6      14       12           13
## dupont    13       10      14        9           16
## dupond    15        7      15       13           14 

Gérer les rownames lors de l’exportation

Il est aussi important de savoir gérer les rownames lors de l’exportation. Par défaut, les rownames sont exportés via la création d’une variable en première position.

# export avec rownames
write.csv2(mydata, "data/mydata_avec_rownames.csv")
 
exportation des données avec les rownames en première colonne

Ici les noms étaient stockés en rownames et lors de l’exportation, ils apparaissent dans la première colonne du fichier csv.

Si, au contraire, vous ne souhaitez pas exporter les rownames,  il est nécessaire d’employer l’argument row.names = FALSE.

write.csv2(mydata, "data/mydata_sans_rownames.csv", row.names = FALSE) 
exportation des données, mais sans les rownames

Ici, les noms qui étaient stockés dans les rownames n’ont pas été exportés (ils sont perdus).

Dans ma pratique courante, je m’en sers surtout pour exporter des data frame dont les rownames sont seulement les numéros des lignes ; cela me permet de ne pas obtenir une variable supplémentaire avec ces numéros de ligne :

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa 
# export avec rownames
write.csv2(iris, "data/iris_avec_rownames.csv") 
exportation des données avec les numéro de lignes dans une variable supplémentaires placée en première position

Ici, lorsque j’exporte les données “iris”, sans rien préciser concernant les rownames, dans la fonction write.csv2(), les rownames (qui sont simplement les numéros des lignes) sont exportés via la création d’une nouvelle colonne en première position.

En revanche, si je précise row.names=FALSE, dans la fonction write.csv2(),alors cela me permet de ne pas créer cette première colonne avec les numéros des lignes qui ne me sert à rien !

exportation sans ajout d'une variable supplemntaire (rownames) en première position
# export sans rownames
write.csv2(iris, "data/iris_sans_rownames.csv", row.names = FALSE)
 

J’espère que ce court article vous permettra de mieux comprendre cette notion de rownames et de les manipuler plus facilement.

 Dites moi en commentaire si vous employez d’autres fonctions liées à ses rownames !

Vous souhaitez soutenir mon travail ?​

Si vous souhaitez soutenir mon travail, vous pouvez faire un don libre sur la page tipeee du blog :

Poursuivez votre lecture​

2 réponses

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.