R au 21ème siècle

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 à grepqui 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 :

  1. Prend le jeu “donnees”
  2. filtre sur le champ parity
  3. sélectionne uniquement la colonne age
  4. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *