Une version actualisée de ce chapitre est disponible sur guide-R : dplyr & Le pipe

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre de son Introduction à R et au tidyverse.

Ce chapitre est évoqué dans le webin-R #04 (manipuler les données avec dplyr) sur YouTube.

dplyr est une extension facilitant le traitement et la manipulation de données contenues dans une ou plusieurs tables (qu’il s’agisse de data frame ou de tibble). Elle propose une syntaxe claire et cohérente, sous formes de verbes, pour la plupart des opérations de ce type.

Par ailleurs, les fonctions de dplyr sont en général plus rapides que leur équivalent sous R de base, elles permettent donc de traiter des données de grande dimension1.

dplyr part du principe que les données sont tidy (voir la section consacrée aux tidy data). Les fonctions de l’extension peuvent s’appliquer à des tableaux de type data.frame ou tibble, et elles retournent systématiquement un tibble (voir la section dédiée).

Préparation

dplyr fait partie du coeur du tidyverse, elle est donc chargée automatiquement avec :

library(tidyverse)

On peut également la charger individuellement avec :

library(dplyr)

Dans ce qui suit on va utiliser les données du jeu de données nycflights13, contenu dans l’extension du même nom (qu’il faut donc avoir installé). Celui-ci correspond aux données de tous les vols au départ d’un des trois aéroports de New-York en 2013. Il a la particularité d’être réparti en trois tables :

  • flights contient des informations sur les vols : date, départ, destination, horaires, retard…
  • airports contient des informations sur les aéroports
  • airlines contient des données sur les compagnies aériennes

On va charger les trois tables du jeu de données :

library(nycflights13)
## Chargement des trois tables du jeu de données
data(flights)
data(airports)
data(airlines)

Normalement trois objets correspondant aux trois tables ont dû apparaître dans votre environnement.

Ces trois tableaux sont au format tibble. Il s’agit d’une extension des tableaux de données utilisé par le tidyverse. Les tibble{data-pkg=“tibble} s’utilisent comme des data.frame, avec justes quelques différentes :

  • leur classe est c("tbl_df", "tbf", "data.frame") ;
  • leur présentation dans la console est amélioriée ;
  • df[, j] renvoie toujours un tibble avec une seule colonne (et non le contenu de cette colonne que l’on obtient avec df[[j]]) ;
  • les colonnes d’un tibble peuvent être des listes ;
  • à la différence d’un tableau de données classique où il est possible d’utiliser un nom partiel (par exemple écrire df$ab pour obtenir df$abc), il est obligatoire d’utiliser les noms complets avec un tibble.

Pour convertir un tableau de données en tibble, on utilisera la fonction as_tibble.

Les verbes de dplyr

La manipulation de données avec dplyr se fait en utilisant un nombre réduit de verbes, qui correspondent chacun à une action différente appliquée à un tableau de données.

slice

Le verbe slice sélectionne des lignes du tableau selon leur position. On lui passe un chiffre ou un vecteur de chiffres.

Si on souhaite sélectionner la 345e ligne du tableau airports :

slice(airports, 345)

Si on veut sélectionner les 5 premières lignes :

slice(airports, 1:5)

filter

filter sélectionne des lignes d’un tableau de données selon une condition. On lui passe en paramètre un test, et seules les lignes pour lesquelles ce test renvoit TRUE (vrai) sont conservées.

Par exemple, si on veut sélectionner les vols du mois de janvier, on peut filtrer sur la variable month de la manière suivante :

filter(flights, month == 1)

Si on veut uniquement les vols avec un retard au départ (variable dep_delay) compris entre 10 et 15 minutes :

filter(flights, dep_delay >= 10 & dep_delay <= 15)

Si on passe plusieurs arguments à filter, celui-ci rajoute automatiquement une condition et entre les conditions. La ligne ci-dessus peut donc également être écrite de la manière suivante, avec le même résultat :

filter(flights, dep_delay >= 10, dep_delay <= 15)

Enfin, on peut également placer des fonctions dans les tests, qui nous permettent par exemple de sélectionner les vols avec la plus grande distance :

filter(flights, distance == max(distance))

select, rename et relocate

select permet de sélectionner des colonnes d’un tableau de données. Ainsi, si on veut extraire les colonnes lat et lon du tableau airports :

select(airports, lat, lon)

Si on fait précéder le nom d’un -, la colonne est éliminée plutôt que sélectionnée :

select(airports, -lat, -lon)

select comprend toute une série de fonctions facilitant la sélection de multiples colonnes. Par exemple, starts_with, ends_width, contains ou matches permettent d’exprimer des conditions sur les noms de variables :

select(flights, starts_with("dep_"))

La syntaxe colonne1:colonne2 permet de sélectionner toutes les colonnes situées entre colonne1 et colonne2 incluses2 :

select(flights, year:day)

all_of et any_of permettent de fournir une liste de variables à extraire sous forme de vecteur textuel. Alors que all_of renverra une erreur si une variable n’est pas trouvée dans le tableau de départ, any_of sera moins stricte.

select(flights, all_of(c("year", "month", "day")))
select(flights, all_of(c("century", "year", "month", "day")))
Erreur : Can't subset columns that don't exist. 
x Column `century` doesn't exist.
select(flights, any_of(c("century", "year", "month", "day")))

where permets de sélectionner des variables à partir d’une fonction qui renvoie une valeur logique. Par exemple, pour sélectionner seulement les variables textuelles.

select(flights, where(is.character))

select peut être utilisée pour réordonner les colonnes d’une table en utilisant la fonction everything(), qui sélectionne l’ensemble des colonnes non encore sélectionnées. Ainsi, si on souhaite faire passer la colonne name en première position de la table airports, on peut faire :

select(airports, name, everything())

Pour réordonner des colonnes, on pourra aussi avoir recours à relocate en indiquant les premières variables. IL n’est pas nécessaire d’ajouter everything() car avec relocate toutes les variables sont conservées.

relocate(airports, lon, lat, name)