knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  echo = TRUE
)

Avant toutes choses

library(dplyr)
data("fruits", package = "minidebuter")

Fruits est un fait un "tibble"

fruits
class(fruits)

Bref, c'est quoi un tibble ?

Mise à jour de la table des classes d'objets !

Nom | Appelation officielle | Exemple ---|---|--- Vecteur | ??? | 1:10 Facteur | factor | gl(2, 2) Matrice | matrix | matrix(1:4, 2, 2)
Tableau | data.frame | mtcars
Tableau | tibble | fruits
Liste | list | list(a = 1, b = 1:10, c = "Hello!") Fonction | function | sin, exp, log

Comment créer une nouvelle colonne ?

Par sécurité : je crée une copie de mes données

fruits2 <- fruits

On utilise le plus souvent l'opérateur $ :

fruits2$Sucres_ratio <- fruits2$Sucres / 100

Le principe de l'ajout de colonne

Sur un tableau tab, je souhaite ajouter la colonne A :

tab$A <- nouvelles_valeurs

Attention :

Exemple d'erreur

fruits2$recyclage <- c(0, 1)
Erreur : Assigned data `c(0, 1)` must be compatible with existing data.
x Existing data has 51 rows.
x Assigned data has 2 rows.
 Only vectors of size 1 are recycled.
Run `rlang::last_error()` to see where the error occurred.

Exemple d'horreur !

mtcars2 <- mtcars
mtcars2$recyclage <- c(0, 1)
mtcars2$recyclage

Le tydiverse

Enchaîner les commandes avec magrittr {.columns-2}

`%>%`

{width=30%}

Exemple {.columns-2 .bigger}

## Histogramme
hist(fruits$Energie)

library(magrittr)
fruits$Energie %>% hist()

Le tidyverse {.bigger}

Tidyverse: https://www.tidyverse.org/

![](img/S04dplyr/tidyverse.jpg){width=70%}

Charger les packages

Charger le package dplyr...

library(dplyr) # ou require(dplyr)

Ou bien charger tidyverse...

library(tidyverse)

... mais cela chargera d'autres packages en plus

Le format "tibble" {.smaller}

Les données sont au format "tibble" : c'est comme des "data-frames" mais en mieux !

fruits

Les fonctions de dplyr {.smaller}

Nous allons voir ensemble quelques fonctions très pratiques de la librairie dplyr.

# | Fonction (US) | Fonction (UK) | Description ---|:-------------:|:-------------:|:---------- 1 | mutate | mutate | Créer ou modifier des colonnes 2 | select | select | Sélectionner des colonnes 3 | relocate | relocate | Ré-arranger des colonnes 4 | arrange | arrange | Trier les lignes 5 | filter | filter | Sélectionner des lignes 6 | group_by | group_by | Grouper des lignes 7 | summarize | summarise | Résumer des groupes 8 | count | count | Compter

{width=100%}

Créer ou modifier des colonnes {.columns-2 .smaller}

Avec la fonction mutate.

fruits2 <- fruits %>% 
  mutate(Sucres_ratio = Sucres / 100)

head(fruits2[, "Sucres_ratio"])

Avec les fonctions classiques.

fruits2 <- fruits
fruits2$Sucres_ratio <- 
  fruits2$Sucres / 100
head(fruits2[, "Sucres_ratio"])

Sélectionner des colonnes {.columns-2 }

Avec la fonction select.

fruits %>% 
  select(
    Energie,
    Sucres,
    Lipides,
    Proteines)

Avec les fonctions classiques.

fruits[, 
  c(
    "Energie",
    "Sucres",
    "Lipides",
    "Proteines")]

Sélectionner des colonnes - bis

la fonction select est très versatile !

fruits %>% 
  select(Energie:Proteines, - Eau)

On peut sélectionner des plages entières de colonnes sur la base de leurs noms, en enlever avec le -, combiner tout cela avec la fonction c()... ou pas !

Attention, la flexibilité a un coût !

Trier des lignes {.columns-2 .smaller}

Avec les fonctions arrange et desc.

fruits %>% 
  select(Energie, Sucres, Fibres) %>%
  arrange(desc(Fibres))

Avec les fonctions classiques

fruits[
  order(fruits$Fibres, decreasing = TRUE),
  c("Energie", "Sucres", "Fibres")]

Sélectionner des lignes {.columns-2 .smaller}

Avec la fonction filter.

fruits %>% 
  filter(Sucres > 60)

Avec les fonctions classiques.

fruits[fruits$Sucres > 60, ]

Sélectionner des plages de lignes {.columns-2 .smaller}

Avec la fonction slice.

fruits %>% 
  slice(3:10)

Avec les fonctions classiques.

fruits[3:10, ]

Grouper des lignes {.smaller}

Avec la fonction group_by :

fruits %>% group_by(groupe)

Les données sont prêtes à être "traitées" groupe par groupe. PS : L'opération ungroup() permet d'enlever les groupes.

Calculer une moyenne {.columns-2 .smaller}

Avec la fonction summarize.

fruits %>% 
  group_by(groupe) %>%
  summarize(SucreMoyen = mean(Sucres))

Avec les fonctions classiques.

aggregate(fruits$Sucres, 
          by = list(fruits$groupe), 
          FUN = mean)

Exercice(s)

Calculer l'énergie moyenne, la teneur en sucres médiane et le maximum de la teneur en Fibres par groupe de fruits et trier le tout par ordre décroissant du maximum de la teneur en Fibres !

Deux autres fonctions pour sélectionner ou transformer des colonnes {.columns-2 .center}


              Sélectionne  Ne sélectionne pas

Ne transforme pas select rename Peut transformer transmute mutate


{width=100%}

Compter {.columns-2}

Avec le "verbe" count :

fruits %>% count(groupe)

On peut ensuite ranger les résultats par ordre décroissant :

fruits %>%
  count(groupe) %>%
  arrange(desc(n))

Intermède : la fonction cut

La fonction cut permet de transformer un vecteur de valeurs numériques en un facteur contenant des intervalles :

Exemple :

entiers <- 1:5
cut(entiers, c(0, 2, 5))

Compter deux choses à la fois

Par exemple, compter dans chaque groupe le nombre de fruits dont la teneur en Vitamine C est inférieure ou supérieure à 50 :

fruits %>%
  mutate(VitCqual = cut(VitamineC, c(0, 50, 100))) %>%
  count(groupe, VitCqual, name = "N")

Super bonus : la table de contingence

Ce n'est pas facile, il vaut mieux utiliser la fonction table :

library(tidyr)
fruits %>%
  mutate(VitCqual = cut(VitamineC, c(0, 50, 100))) %>%
  count(groupe, VitCqual, name = "N") %>%
  pivot_wider(id_cols = groupe, 
              names_from = VitCqual, 
              values_from = N)

D'autres fonctions utiles en bonus {data-background=#ffffff}

Avec les illustrations de Allison Horst (https://www.allisonhorst.com/)

{width=100%}

{width=100%}

{width=100%}

Il y a tellement d'autres fonctions ! {data-background=#ffffff}

{width=50%}



vguillemot/debuter documentation built on Oct. 8, 2024, 10:47 p.m.