Le package dplyr de R

Fondamentaux de dplyr

Le langage R est aujourd’hui incontournable pour l’analyse de données et les statistiques. Mais il n’est pas toujours très fluide ! D’où l’immense intérêt du package dplyr, qui fait partie de l’écosystème tidyverse.

Nous montrerons ici les différences syntaxique et cognitive entre Base R et dplyr puis, sans entrer dans les détails mais avec un exemple simple, nous listerons les principales fonctionnalités de dplyr.

 

Présentation

dplyr est un package R dédié à la manipulation de données tabulaires (data frames, tibbles). Il s’inscrit dans le tidyverse, une collection de packages conçus pour faciliter l’analyse de données en R.

dplyr ne s’occupe ni de modélisation ni de graphiques et ne remplace pas l’ensemble du langage R. Il sert juste à transformer les données. Concrètement, il les prépare avant une analyse graphique ou une modélisation. Il apporte à Base R plus de cohérence.

 

Installation

install.packages("dplyr")
library(dplyr)

On peut aussi charger tout le tidyverse avec library(tidyverse).

 

Différences avec Base R

Les règles de dplyr :

  • Chaque ligne est une observation.
  • Chaque colonne est une variable.
  • On enchaîne des verbes.
  • On lit le code de gauche à droite.

Le symbole %>%, appelé pipe, transmet le résultat d’une étape à la suivante.

Conceptuellement, cela change la manière de penser le code.

  • En base R, on imbrique.
  • Avec dplyr, on enchaîne.

Base R :

subset(df[, c("age", "sexe")], age > 20)

dplyr :

df %>%
filter(age > 20) %>%
select(age, sexe)

La différence n’est pas seulement syntaxique ; elle est cognitive.

L’imbrication de Base R demande de lire de l’intérieur vers l’extérieur tandis que le pipe %>% permet une lecture linéaire. Ainsi, le code reflète la logique du raisonnement mais il faut comprendre que chaque étape retourne un nouvel objet.

Nous avons vu que les lignes représentaient des observations et les colonnes des variables. Ce principe, dit du tidy data, impose une discipline conceptuelle qui facilite les transformations ultérieures et l’interopérabilité. Mais parfois, il oblige à restructurer ses données avant de pouvoir les travailler.

opérateur

Si l’on isole dplyr, la rupture avec base R tient principalement à deux éléments :

  • L’usage systématique des verbes (fonctions) select(), filter(), mutate(), summarise(), etc.

    On décrit l’action à effectuer sur le tableau, au lieu de manipuler explicitement les index.

  • Le pipe %>% (et désormais |> en R natif) favorise une écriture séquentielle.

Pour résumer, Base R est historiquement plus proche d’une logique impérative : « Prends cet objet, accède à telle case, modifie telle partie » tandis que le tidyverse adopte davantage une logique déclarative : « je veux garder ces colonnes », « je veux filtrer selon cette condition », « je veux résumer par groupe » … On exprime l’intention plutôt que la mécanique. Ce déplacement cognitif ne vient pas seulement de dplyr, il est systémique dans le tidyverse.

Mais ce n’est pas une rupture brutale avec Base R. Le tidyverse se fonde sur les vecteurs, les data frames, la logique booléenne de R et son système d’objets. Il ajoute une couche d’abstraction sans remplacer les fondations.

 

Fondamentaux

Les cinq verbes les plus utilisés sont :

  • select() pour le choix des colonnes.
  • filter() pour filtrer les lignes.
  • mutate() pour créer ou modifier des colonnes.
  • arrange() pour trier.
  • summarise() pour résumer.

Pour changer la structure logique du tableau : group_by().

Autres manipulations :

  • distinct() pour extraire les lignes uniques (suppression des doublons).
  • count() pour compter le nombre d’observations par groupe.
  • across() pour appliquer la même transformation à plusieurs colonnes.

Jointures : left_join(), inner_join(), right_join(), full_join().

Gestion des valeurs manquantes :

  • Coalesce() pour remplacer les valeurs manquantes (NA) d’un vecteur par les valeurs d’un autre vecteur.

  • Replace_na() pour remplacer les NA par une valeur définie (par exemple 0). Nécessite de charger tidyr.

 

Exemple d’utilisation des cinq verbes usuels

Soit des références d’articles et des prix unitaires hors taxe. Nous devons sélectionner la colonne des prix, la filtrer pour éliminer les valeurs manquantes, ajouter la TVA en multipliant les prix par 1,2, puis afficher les prix TTC triés en ordre croissant et leur moyenne.

Chargeons le package puis entrons les données.

library(dplyr)
articles <- data.frame(
ref = c("A101", "A102", "A103", "A104", "A105"),
PU = c(10, 25, NA, 8, 15)
)

Nous relevons une seule valeur manquante. Le pipeline principal est le suivant :

prix_ttc <- articles %>%
select(PU) %>%                  # 1. sélectionner la colonne PU
filter(!is.na(PU)) %>%          # 2. éliminer la valeur manquante
mutate(PU = PU * 1.2) %>%       # 3. calcul du prix TTC
arrange(PU)                     # 4. tri croissant
prix_ttc

Vous constatez que chaque ligne se termine par un pipe. Pour le filtrage, remarquez !is pour signifier la différence dans un test. Pour un débutant, c’est la seule difficulté de ce script. Il ne faut pas utiliser l’opérateur logique !=, notamment en écrivant PU != NA parce que comparer une valeur à quelque chose d’inconnu donne une réponse inconnue !

En sortie :

Enfin, terminons notre script en demandant la moyenne et nous aurons illustré les cinq verbes usuels.

prix_ttc %>%
summarise(moyenne_TTC = mean(PU)

C’est bien une suite logique d’opérations qui a permis d’obtenir ce résultat. Avec Base R, en version très condensée, nous aurions écrit ceci :

pu <- sort(articles$PU[!is.na(articles$PU)] * 1.2)
pu
mean(pu)

 

dplyr