Dans l’article Un premier programme en R je vous ai présenté l’accès de base aux objets principaux que sont les jeux de données (R appelle cela un dataframe, il en existe d’autres comme les matrices et les listes, je vous laisserai regarder les différences par vous-même pour le moment).
Cependant, il faut bien constater que cette notation par crochets n’est rapidement pas très lisible et que l’empilement des parenthèses risque rapidement de perdre le plus vaillant des débutants.
Introduisons donc 2 librairies majeures du R moderne : magrittr et dplyr
Magrittr
Vous avez probablement noté que les utilisateurs de R adorent les jeux de mots (souvent avec un “r” dedans). Ce package n’échappe pas à la règle. Son nom découle directement de ce tableau célèbre de René Magritte. Il faut savoir que le caractère “|” (barre verticale) s’appelle en anglais un “pipe” (littéralement un tuyau) car il est utilisé en programmation shell pour transmettre le contenu de la sortie d’un programme vers l’entrée d’un autre. Par exemple en shell :
fsenis@machine:/# cat /etc/passwd | grep fsenis
fsenis:x:5014:5005::/home/fsenis:/bin/bash
lit (cat
) le contenu du fichier /etc/passwd et le transmet à grep
qui ne garde que les lignes contenant “fsenis”.
Partant du constat de la simplicité de ce mécanisme, magrittr transpose ce fonctionnement dans R. Malheureusement le “pipe” (|) est déjà utilisé, c’est le “OU logique”. Il a donc été convenu d’utiliser un trigraphe “%>%” pour réaliser la même fonction.
%>% n’est donc pas un |
Ainsi la fonction
mean(donnees$age)
peut s’écrire grâce à magrittr
donnees$age %>% mean()
que l’on peut aussi écrire sans parenthèse
donnees$age %>% mean
En fait magrittr transforme tout appel :
x %>% fonction(paramètres)
en :
fonction(x,paramètres)
Il existe des variations à %>% mais que vous n’utiliserez quasiment jamais, je les cite pour la complétude (Elles ne sont QUE dans magrittr
, donc il faut explicitement inclure la librairie) :
- %T>% : “Tee Pipe” qui retourne la partie gauche (fait exécuter la fonction sans s’occuper du résultat), cela ne sert pas en pratique courante mais parfois avec des fonctions d’affichage
Exemple :
> c(1,2) %T>% print %>% mean
[1] 1 2
[1] 1.5
On a bien l’exécution du print
qui affiche à l’écran la forme texte de la donnée passée au %T>%
puis la donnée source est à nouveau passée à la fonction mean
et non le résultat du print
.
- %<>% : “Assignement pipe”, c’est un cumul du pipe
%>%
et de l’assignement<-
Exemple :
> x <- c(1, 2)
> x
[1] 1 2
> x %<>% mean
> x
[1] 1.5
La valeur x contient pour commencer un vecteur de 2 nombres (lignes 1 et 2) puis l’application de %<>%
stocke la valeur de mean(x)
dans x en une seule expression.
%$% : “Exposition pipe” est un peu plus poilu et souvent inutile au débutant. Il permet d’exposer les vecteurs contenus dans un jeu de données à la fonction appelée
Exemple :
>list(a = c(1, 2), b = 2) %$% mean(a)
[1] 1.5
La valeur de retour applique mean
au membre de la liste s’appelant “a”.
et c’est TOUT !
dplyr
Pour sa part, dplyr
est une librairie bien plus conséquente qui aura le droit à plusieurs articles plus détaillés et d’une puissance étonnante (mais qui serait bien moins lisible sans le concept de magrittr
qui en est d’ailleurs un prérequis).
Dplyr
permet de triturer un jeu de données mais aussi des jeux de données entre eux.
Il permet par exemple de transformer
mean(donnees[donnees$parity > 3, "age"])
en
donnees %>% filter(parity > 3) %>% select(age) %>% mean
qui peut facilement se lire de gauche à droite :
- Prend le jeu “donnees”
- filtre sur le champ parity
- sélectionne uniquement la colonne age
- et enfin applique la function
mean
(moyenne) au résultat
En fait, il suffit de lire pour comprendre et de le penser pour l’écrire.
Pour les personnes qui connaissent un peu le SQL, il existe une certaine similarité entre les 2 syntaxes (sous réserve de l’existence de la fonction mean
):
SELECT mean(age) as moyenne FROM donnees WHERE parity > 3
Conclusion
Après un premier contact un peu brutal avec l’interface standard d’accès aux jeux de données, un peu absconde, nous venons de voir que des librairies existent pour décupler l’expressivité du code écrit et facilité la transcription de l’idée au code.
Nous aurons l’occasion dans les prochains posts de décrire plus avant toute la puissance de dplyr.