Le package dplyr permet de réaliser de façon intuitives des transformations de tableaux. Dans ce tutoriel, nous allons nous entraîner avec les données “fruits”.

NB : Le jeu de données est déjà chargé en mémoire !

Les tibbles

Le package dplyr opère sur des tibbles : l’équivalent tidy des objets de classe data.frame, ou, autrement formulé, des structures de données rectangulaires dont chaque colonne peut contenir un type de valeurs différent.

Pour les besoins du cours, j’ai fait en sorte que le jeu de données fruits soit une tibble.

“Imprimez” fruits dans la console et comparez avec ce que donnerait l’impression si fruits était de classe data.frame : quelles sont les différences ?

# print pour l'impression 
# as.data.frame pour la transformation
print(fruits)
# Si fruits était une data.frame
print(as.data.frame(fruits))

En résumé : vous n’avez pas besoin de vous inquiéter des différences entre tibbles et data.frames, en tout cas pas pour le moment. Il faut juste avoir conscience que les deux existent. Si vous le souhaitez, vous pouvez décider de ne travailler qu’avec des data.frames : les fonctions du tidyverse fonctionneront quand même. Par contre, nous verrons des fonctions que ne fonctionnent pas avec des tibbles, c’est pour cela que la fonction as.data.frame est importante.

Pour en savoir plus, rendez-vous ici !

Filtrer des lignes, sélectionner des colonnes etc..

Sélectionnez les fruits contenant moins de 50% d’eau. A quel groupe appartiennent ces fruits ?

# Pour juste filtrer
fruits %>%
  filter(Eau <= 50)
# Pour filtrer puis sélectionner la colonne "groupe"
fruits %>%
  filter(Eau <= 50) %>%
  select(groupe)

Sélectionnez les colonnes nom, groupe, Sucres et Fructose avec la fonction select, puis triez les valeurs par ordre décroissant de teneur en sucres avec la fonction arrange. Quel est le fruit contenant le plus de sucres ?

# select pour la sélection
# arrange pour le tri
# desc pour obtenir un tri décroissant
fruits %>%
  select(nom, groupe, Sucres, Fructose) %>%
  arrange(desc(Sucres))

Utilisez la fonction mutate pour calculer le ratio de la teneur en sucres par la teneur en fibres et triez les valeurs obtenues par ordre croissant. Faites exactement la même chose avec la fonction transmute : que se passe-t-il ?

# Avec mutate
fruits %>%
  mutate(ratioSF = Sucres / Fibres) %>%
  arrange(ratioSF)

# Avec transmute : on perd toutes les autres colonnes...
fruits %>%
  transmute(ratioSF = Sucres / Fibres) %>%
  arrange(ratioSF)
# ... mais on peut les rajouter si on veut les garder
fruits %>%
  transmute(nom, ratioSF = Sucres / Fibres) %>%
  arrange(ratioSF)

Comptez le nombre de fruits par groupe à l’aide de la fonction count. Cette fonction s’utilise par exemple comme ceci : fruits %>% count(), et permet de compter toutes les lignes d’une table. Notez que la colonne contenant les comptages s’appelle n par défaut (voir ?count pour plus de détails).

fruits %>%
  count()
# Utilisez "group_by"
fruits %>%
  group_by(groupe) %>%
  count()
# Si on veut changer le nom de la colonne 
# contenant les comptages :
fruits %>%
  group_by(groupe) %>%
  count(name = "fréquence")

Résumer des plages de valeurs

Pour cet exercice, nous allons résumer la variable Energie par groupe de fruits. Nous souhaitons construire la table EnergieQuartiles définie de la manière suivante :

  • chaque ligne est un groupe de fruits,
  • la colonne Q1 contient le premier quartile de la variable Energie,
  • la colonne Q2 contient la médiane,
  • la colonne Q3 contient le troisième quartile.

Utilisez la fonction summarise pour créer la table EnergieQuartiles. N’oubliez pas de consulter l’aide de la fonction summarise pour vous guider. Pour cet exercice vous aurez besoin des fonctions :

  • group_by pour grouper les lignes,
  • summarise pour résumer les valeurs,
  • quantile pour calculer les quartiles.
EnergieQuartiles <- fruits %>%
  group_by(groupe) %>%
  summarize(
    Q1 = quantile(Energie, 0.25),
    Q2 = quantile(Energie, 0.5),
    Q3 = quantile(Energie, 0.75)
  )
EnergieQuartiles
### NB : vous pouvez obtenir le résultat au format "long" très facilement avec summarise : 
fruits %>%
  group_by(groupe) %>%
  summarize(
    Value = quantile(Energie, (1:3)/4),
    Quantile = c("Q1", "Q2", "Q3")
  )
### ou toujours au format "wide", mais avec une 
### fonction intermédiaire
foo <- function(x) {
  return(tibble(Q1 = quantile(x, 0.25),
    Q2 = quantile(x, 0.5),
    Q3 = quantile(x, 0.75)))
}

fruits %>%
  group_by(groupe) %>%
  summarize(foo(Energie))