Cliquer ici pour les diapos de cours

4.1 Lire une tibble

Dans la suite des exercices concernant la manipulation de tableaux de données nous allons utiliser le tableau potions disponible ici.

Le jeu de données potions recense un certain nombre de potions magiques pour lesquelles sont renseignées:

  • des quantités d’ingrédients (noms de variables commençant par i_)
  • des scores relatifs aux propriétés magiques des potions (noms de variables commençant par p_)
  • des modalités d’élaboration des potions (noms de variables commençant par m_)

Parmi les ingrédients, on peut citer par exemple

  • i_aile_papillon des ailes de papillon
  • i_bave_crapaud de la bave de crapaud
  • i_pierre_lune de la pierre de lune

etc.

En terme de propriétés on a relevé si les potions permettent

  • p_alteration: d’altérer l’apparence, de transformer en plante verte ou en limace
  • p_transformation: de se transformer soi-même, en loup-garou, troll ou beau gosse
  • p_conjuration: de conjurer des esprits ou des morts-vivants
  • p_destruction: de lancer des éclairs, des boules de feu ou des pics de glace
  • p_invisibilite: de devenir invisible
  • p_resistance: de se protéger des attaques

Quant aux modalités d’élaboration des potions, elles décrivent:

  • m_formule: la langue de la formule magique associée à la confection de la potion (si une formule est nécessaire)
  • m_preparation: si la préparation correspond à un bouillon, une macération ou une distillation des ingrédients.

Utilisez la fonction read_csv() ou read_delim()(du package readr) pour lire cette table et assignez-la à un objet potions.

path="http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/datasets/potions.csv"
potions <- readr::________
head(potions)
path="http://perso.ens-lyon.fr/lise.vaudor/grimoireStat/datasets/potions.csv"
potions <- readr::read_delim(path,
                             delim=";")
head(potions)

4.2 Sélectionner des colonnes

La fonction select() permet de sélectionner des colonnes d’un tableau de données.

Le tableau potions et le package dplyr ont déjà été chargés dans l’environnement ci-dessous. Ce sera pour l’ensemble des exercices des parties 4 et 5.

Examinez la table potions. Complétez le code pour sélectionner :

  • les variables m_formule, i_bave_crapaud, et p_destruction
pot <- select(potions,_______)
head(pot)
pot <- select(potions,m_formule,i_bave_crapaud,p_destruction)
head(pot)
  • toutes les variables SAUF i_graisse_troll et p_conjuration
pot <- select(_______________)
head(pot)
pot <- select(potions,-i_graisse_troll,-p_conjuration)
head(pot)
  • toutes les variables de m_formule à i_ectoplasme
pot <- ______(_______________)
head(pot)
pot <- select(potions,m_formule:i_ectoplasme)
head(pot)
  • toutes les variables de type ingrédient (qui commencent par le motif “i_”), à l’aide de starts_with()
pot <- _______________________
head(pot)
pot <- select(potions,starts_with("i_"))
head(pot)

4.3 Filtrer des lignes

Examinez la table potions. Complétez le code pour filtrer les lignes et ne garder que:

  • les potions dont la préparation correspond à une macération des ingrédients
pot <- filter(____)
head(pot)
pot <- filter(potions, m_preparation=="maceration")
head(pot)
  • les potions dont le pouvoir invisibilisant est fort (>15) tout en conférant une résistance correcte (>10).
pot <- _____
head(pot)
pot <- filter(potions, p_invisibilite>15,p_resistance>10)
head(pot)

4.4 Arranger les lignes

La fonction arrange() permet de réordonner les lignes d’un tableau.

Complétez le code pour réarranger les tableaux par valeurs de variables. Pensez à utiliser la fonction auxiliaire desc() pour ranger les valeurs dans l’ordre décroissant.

Ordonnez la table potions par :

  • p_resistance
pot <- arrange(potions,_____)
head(pot)
pot <- arrange(potions,p_resistance)
head(pot)
  • m_formule
pot  <- arrange(_____________)
head(pot)
pot  <- arrange(potions, m_formule)
head(pot)
  • m_formule et p_resistance
pot <-  _____(_________________)
head(pot)
pot <-  arrange(potions, m_formule, p_resistance)
head(pot)
  • m_formule, et p_resistance décroissant
pot <- ___________________________
head(pot)
pot <- arrange(potions, m_formule, desc(p_resistance))
head(pot)

4.5 Transformer le tableau

La fonction mutate() permet de créer et ajouter de nouvelles variables à un tableau.

Le tableau potions et le package dplyr a déjà été chargé dans l’environnement ci-dessous.

Complétez le code pour créer de nouvelles variables.

  • L’ingrédient “pierre de lune” est dans une unité peu adaptée (picomètre cube par litre de potion). Transformez la colonne i_pierre_lune pour que sa nouvelle unité soit des millimètres cube par litre de potion.
pot=mutate(potions,
           ____=____/1e+27)
head(pot)
pot=mutate(potions,
           i_pierre_lune=i_pierre_lune/1e+27)
head(pot)
  • Il est particulièrement difficile de se procurer des larmes de crocodiles. Dans pot2, la nouvelle variable rarete_ressource prend les valeurs “oui” quand i_larmes_crocodile>8 (et “non” dans le cas contraire).
pot=mutate(potions,
           _______=case_when(_____~____,
                             _____~____))
head(pot)
pot=mutate(potions,
           rarete_ressource=case_when(i_larmes_crocodile>8~"oui",
                                      TRUE~"non"))
head(pot)

4.6 Résumer l’information

La fonction summarise() permet de résumer l’information contenue dans un tableau, éventuellement groupe par groupe (groupes définis à l’aide de la fonction auxiliaire group_by()).

Complétez le code pour créer de nouveaux tableaux résumant une partie de l’information contenue dans potions.

Pensez à la différence entre les fonctions auxiliaires n() et n_distinct().

  • Calcul de la moyenne de p_resistance:
pot <- summarise(potions,
                 moy_resistance=_______)
head(pot)
pot <- summarise(potions,
                 moy_resistance=mean(p_resistance))
head(pot)
  • Calcul de la moyenne de p_resistance en fonction de m_formule:
pot <- _________(group_by(potions,______),
                 moy_resistance=__________,
                 ___)
head(pot)
pot <- summarise(group_by(potions,m_formule),
                 moy_resistance=mean(p_resistance))
head(pot)
  • Calcul de la moyenne de p_resistance (moy_resistance) et du nombre de potions (nb_potions) en fonction de m_formule:
pot <- ___________________________________
head(pot)
pot <- summarise(group_by(potions,m_formule),
                 moy_resistance=mean(p_resistance),
                 nb_potions=n())
head(pot)
  • calcul de la moyenne de p_resistance et du nombre de potions en fonction de m_formule et de m_preparation:
pot <- ___________________________________
head(pot)
pot <- summarise(group_by(potions,m_formule,m_preparation),
                 moy_resistance=mean(p_resistance),
                 nb_potions=n())
head(pot)

4.7 Chaînage

L’utilisation de l’opérateur pipe (%>%) permet d’enchaîner plusieurs opérations de dplyr.

La table potions compte 67 lignes dont 9 ont une propriété invisibilisante supérieure à 20, et 14 requièrent l’usage d’une formule en elfique. La table potions compte par ailleur 17 colonnes dont 9 relatives à des ingrédients.

pot <- potions %>%
  filter(p_invisibilite>20 & m_formule=="elfique")%>%
  select(starts_with("i_"))

4.8 Chaînage: on enchaîne, on enchaîne!

Complétez les scripts ci-dessous. Gardez à l’esprit qu’en utilisant les %>% vous n’avez plus besoin de passer de table en premier argument…

  • on prend potions, puis
  • on filtre pour ne garder que les macérats, puis
  • on sélectionne les colonnes pour ne garder que les propriétés p_..., puis
  • on arrange la table par ordre décroissant de p_resistance.
pot <- potions %>%
  filter(______) %>%
  select(______) %>%
  arrange(______)
head(pot)
pot <- potions %>%
  filter(m_preparation=="maceration") %>%
  select(starts_with("p_")) %>%
  arrange(desc(p_resistance))
head(pot)
  • on prend potions, puis
  • on filtre pour ne garder que les potions ne requérant pas l’usage d’une formule, puis
  • on groupe par type de préparation, puis
  • on résume l’information en calculant
    • le minimum min_inv,
    • la médiane med_inv et
    • le maximum max_inv de p_invisibilite.
pot <- _____
_____
_____
_____
pot
pot <- potions %>%
  filter(m_formule=="aucune") %>%
  group_by(m_preparation) %>%
  summarise(min_inv=min(p_invisibilite),
            med_inv=median(p_invisibilite),
            max_inv=max(p_invisibilite))
pot

4.9 Résumer plusieurs variables: across

L’usage de l’auxiliaire across() permet de résumer l’information de la même façon pour toute une série de variables.

Calculez la moyenne de toutes les propriétés en fonction du mode de préparation de la potion à l’aide de cet auxiliaire:

pot=potions %>% 
  group_by(m_preparation) %>% 
  summarise(_______)
pot
pot=potions %>% 
  group_by(m_preparation) %>% 
  summarise(across(starts_with("p_"),mean))
pot

4.10 Allonger le tableau

On veut reformer le tableau pour que l’ensemble des propriétés apparaissent sur une même colonne. On s’attend donc à un tableau avec une colonne p_type et une colonne p_valeur.

Utilisez la fonction tidyr::pivot_longer() pour réaliser cette opération.

potions_long=potions %>% 
  tidyr::pivot_longer(cols=______,
               names_to=_______,
               values_to=______)
potions_long %>% head()
potions_long
potions_long=potions %>% 
  tidyr::pivot_longer(cols=starts_with("p_"),
               names_to="p_type",
               values_to="p_valeur")
potions_long %>% head()
potions_long