Format tidy (wide) ou format long des datasets: pourquoi, et comment ?

format tidy et long avec R

1. Le format tidy (ou wide) et le format long

 1.1 Format tidy ou wide:

Je dis très régulièrement que, pour être traités avec le logiciel R, les jeux de données doivent être au format “tidy”, c’est-à-dire avec une ligne par observation, une variable par colonne, et une valeur au croisement d’une ligne et d’une colonne.

format wide et lon avec R

Le format tidy, d’après  R for Data Science.

Cette appelation “tidy” a été donnée assez récemment par Hadley Wickham. Avant cela, on parlait de format “wide”.

Par exemple le jeu de données suivant, dérivé du jeu de données iris, est au format tidy (ou wide).

 

 

1.2 Le format long

Bien que le format “tidy” ou “wide” soit le format le plus adéquat pour traiter les données, parfois, il peut être utile de passer nos jeux de données en format “long”. Dans ce format, le jeu de données est réduit à trois colonnes :

  • une contenant l’identifiant de l’observation (pas forcément nécessaire et dans ce cas,le jeu de données n’a que les deux variables suivantes)
  • une (ici nommée “variable”) contenant le nom de la variable considérée,
  • une (ici nommée “value”) contenant la valeur.

Par exemple, le jeu de données précédent, passé en format long, est comme cela :

 

Voici un schéma pour visualiser la transformation du format tidy/wide vers le format long :

format tidy et long avec R

2. Pourquoi utiliser le format long ?

Parce que parfois, c’est plus pratique de disposer du jeu de données en format long.

2.1 Facilité pour calculer des paramètres

Par exemple pour calculer des paramètres descriptifs pour toutes les variables, avec la fonction summarise() du package dplyr. Il suffit alors d’employer group_by(variable), comme ceci :

 

2.2 Facilité pour faire du faceting avec ggplot2

Par exemple, si je veux visualiser la densité de distribution des variables Sepal.Length, Sepal.Width, Petal.Length , et Petal.Width du jeu de données “iris”.

Avec le format tidy, il faut faire le plot variable par variable, ou bien faire une boucle. Mais quand on débute avec R, faire des boucles avec des ggplots ce n’est pas la chose la plus simple !

 

facettng avec ggplot2

Alors que si on a un jeu de données en format long, il suffit d’inclure la variable “variable” dans la fonction facet_wrap(), ou facet_grid() , comme cela:

 

 

 

facetting avec ggplot2

 

3. Passer du format tidy (ou wide) au format long

Il est très facile de transformer un jeu de données au format tidy (ou wide) vers un format long. Pour cela, on utilise la fonction gather() du package tidyr, qui fait parti du super package tidyverse.

Voici un exemple avec le jeu de données “iris” :

 

Ici, on obtient un warning, car le jeu de données “iris” comporte une variable catégorielle (Species). Dans ce cas, on peut indiquer à la fonction gather(), de ne pas considérer la variable “Species”, en utilisant le signe – (moins), comme cela :

 

Dans ce cas, une troisième variable est créée et comporte le nom de l’espèce à laquelle se rapporte chacune des lignes :

 

 

4. Quelques exemples de calcul de paramètres decsriptifs

Comme expliqué précédemment, on utilise la variable nommée “variable” en argument de la fonction group_by(), avant d’utiliser la fonction summarise(), comme ceci:

 

Et si on veut calculer ces mêmes paramètres mais en distinguant les espèces, rien de plus simple : on ajoute la variable Species dans la fonction group_by() :

 

 

Et si on souhaite changer l’ordre d’apparition des variables Petal.Length, Petal Width, Sepal.Length et Sepal.Width, il faut :

  1. transformer la variable “variable” en facteur (car elle est considérée comme une chaîne de caractère)

  2. modifier les levels de la variable “variable”.

 

 

Dans la sortie, c’est à présent la variable Sepal.Length qui est en première ligne.

 

5. Quelques exemples pour le faceting avec ggplot2

De la même façon, le changement des levels , va entraîner une modification de l’ordre des sous plots dans le faceting. Par exemle, à présent c’est la variable Sepal Length qui est représentée dans le premier sous plot, puis la variable Sepal.Width, etc..

 

 

faceting avec ggplot2

Et comme précédemment, si vous souhaitez obtenir la densité de ces quatre variables, mais en distinguant chacune des espèces, vous pouvez le faire en rajoutant la variable Species dans les fonctions facet_wrap() ou facet_grid() :

 

 

faceting avec ggplot2 et R

 

 

 

faceting avec un format long

6 Repasser du format long au format tidy (wide)

Pour cela, il est nécessaire d’utiliser la fonction inverse de la fonction gather(), qui est la fonction spread() (toujours dans le package tidyr). Cette fonction nécessite que le format long dispose d’un identifiant unique pour chaque ligne. Il est donc nécessaire de l’ajouter avant si celui-ci n’est pas présent. Dans l’exemple ci dessous, cela correspond à la variable “id”:

 

Conclusion :

J’espère que cet article vous permettra de vous approprier cette astuce consistant à passer d’un format tidy/wide à un format long pour faciliter vos analyses et vos visualisations. Si vous avez d’autres astuces, indiquez-les-moi en commentaire.

Et si cet article vous a plu, partagez le 😉

Poursuivez votre lecture : 

Partager l'article
  •  
  •  
  •  
  •  
  •  
    10
    Partages
  • 10
  •  
  •  
  •  
  •  

4 commentaires

  1. Harscoat Répondre

    Bonjour Claire,

    Merci beaucoup pour ce post. C’est toujours un plaisir de recevoir le mail me prévenant d’un nouveau post. Je sais que je vais encore apprendre plein de chose.
    J’ai une question. Au tout début (1.1) comment passes-tu de la base “iris” à “my_iris”.
    J’ai pas bien compris le principe du format “tidy”.
    S’agit-il simplement de rajouter une colonne “id” ?
    J’avoue qu’il y a un point d’accroche que j’ai du mal à appréhender.

    Encore mille merci pour tous ces enseignement.

    • Claire Della Vedova Auteur de l’articleRépondre

      Bonjour,
      j’ai créé le dataset my_iris comme cela :
      my_iris < - iris %>%
      mutate(id=1:n()) %>%
      select(id, everything(),-Species)

      my_iris <- my_iris[1:5,] C'était peut être maladroit, parce que le dataset iris est déjà en format tidy : une ligne par observation, et une colonne par variable. Donc non, pas besoin de rajouter une colonne id pour être en format tidy. J'espère que c'est plus compréhensible maintenant ! Bonne continuation

Laisser un commentaire

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