Manipuler les données avec dplyr
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éroportsairlines
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 untibble
avec une seule colonne (et non le contenu de cette colonne que l’on obtient avecdf[[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 obtenirdf$abc
), il est obligatoire d’utiliser les noms complets avec untibble
.
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)