Nous allons voir ici des notions plus avancées de R. Avant de commencer, assurez-vous que vous avez bien téléchargé tous les fichiers nécessaires pour la séance. Vous devez avoir assimilé les notions de la première, deuxième et troisième parties de l’introduction à R avant de commencer cette séance.
Dans ce document, nous allons couvrir les thèmes suivants:
Le concept de tuyau
La librairie dplyr pour manipuler des données
Autres outils de manipulation de données en R
Données
Nous allons continuer à utiliser ici les données présentes dans le fichier salesmen.txt qui contient les ventes réalisées par les employés d’une compagnie. Chaque ligne du fichier représente un employé et les variables sont les suivantes:
EmpID: ID de l’employé
Month: mois de l’année (de 1 à 12)
nSales: nombre de ventes totales
TotSales: total des ventes (en $)
Le concept de tuyau
L’opérateur de piping |>, natif à R depuis la version 4.1, permet d’éviter d’utiliser les parenthèses emboîtées lors de l’appel de fonctions. Voici des exemple de commandes, avec ou sans tuyau, qui sont équivalentes:
donnees <-read.table("Data/salesmen.txt", header =TRUE)# l'argument de gauche sert de premier argument à la fonction de droitenrow(donnees)
[1] 1800
donnees |>nrow()
[1] 1800
# Autre exemple:x <-c(1, 2, 5, 6)round(exp(diff(log(x))), 1)
[1] 2.0 2.5 1.2
# L'ordre des opérations est plus lisible avec le tuyaux |>log() |>diff() |>exp() |>round(1) # ici, 1 est fourni au 2e argument (digits)
[1] 2.0 2.5 1.2
L’opérateur |> prend donc tout ce qui se trouve à sa gauche et l’insère, comme premier argument, dans la fonction à sa droite. Le code se lit donc de la gauche vers la droite. Il est recommandé de changer de ligne après chaque instance de l’opérateur |> afin d’améliorer la lisibilité du code.
Paquet dplyr
La collection de paquets tidyverse contient une collection d’outils pour la science des données. Parmis ceux-ci, le paquet dplyr contient des fonctions qui peuvent être très utiles pour préparer des données, et notamment pour réaliser des tâches impliquant le filtrage de données (par ex., sélectionner certaines lignes ou colonnes remplissant certaines conditions), la fusion de tableaux sur des lignes ou colonnes ou l’agrégation de données (par ex., le calcul de résumés statistique sur des sous-ensembles de données). Nous allons voir en détail ces trois aspects dans les sections suivantes.
Filtrage de données
La fonction filter du paquet dplyr permet de sélectionner les lignes qui vérifient une condition logique. Si on a plusieurs conditions, on les met séparément avec des virgules. Chaque énoncé doit être vrai (intersection) pour que la ligne soit sélectionnée.
library(dplyr)# Extrait les obs pour lesquelles EmpID > 1005donnees |>filter(EmpID >1005)
# Extrait les obs pour lesquelles nSales <= 10 ET EmpID > 1005# Tous les énoncés séparés par des virgules doivent être vraisdonnees |>filter(EmpID >1005, nSales <=10)
On aura souvent besoin de créer de nouvelles colonnes à partir de données existantes. La fonction mutate permet de faire des modifications à partir de colonnes existantes et d’opérations arithmétiques courantes.
Il existe plusieurs fonctions de la librairie dplyr qui permettent de combiner ensemble des tables de données même lorsque le nombre de lignes et colonnes n’est pas le même:
bind_rows(x, y): combine les tables x et y par lignes même si elles n’ont pas le même nombre de colonnes (les variables manquentes sont traitées comme des valeurs manquantes)
inner_join(x, y, by = ): combine les observations dex ety par rapport à la variable by
left_join(x, y, by =): combine les observations par rapport à la variable by dans la table x, même si elles n’apparaissent pas dans la tabley
left_join(x, y, by =): combine les observations par rapport à la variableby dans la table y, même si elles n’apparaissent pas dans la tablex
full_join(x, y, by =): combine les observations par rapport à la variableby dans x ou dans y.
Pour illustrer l’utilisation de ces fonctions, nous allons utiliser trois fichiers de données qui contiennent chacun des parties des données salesmen.txt:
sales_jtgauche <- partie1 |>left_join(y = partie3, by =c("EmpID", "Month"))head(sales_jtgauche)
EmpID Month nSales Team TotSales
1 100 1 16 A 15687.46
2 100 2 21 A 21496.56
3 100 3 11 A 12015.78
4 100 4 18 A 18537.36
5 100 5 13 A 13440.72
6 100 6 13 A 12748.57
tail(sales_jtgauche)
EmpID Month nSales Team TotSales
643 908 7 26 A 23665.94
644 908 8 25 A 22634.97
645 908 9 27 A 24878.33
646 908 10 25 A 24022.05
647 908 11 27 A 26595.12
648 908 12 34 A 32262.33
sales_jtdroite <- partie1 |>right_join(y = partie3, by =c("EmpID", "Month"))head(sales_jtdroite)
EmpID Month nSales Team TotSales
1 100 1 16 A 15687.46
2 100 2 21 A 21496.56
3 100 3 11 A 12015.78
4 100 4 18 A 18537.36
5 100 5 13 A 13440.72
6 100 6 13 A 12748.57
tail(sales_jtdroite)
EmpID Month nSales Team TotSales
1795 2504 7 NA <NA> 30474.46
1796 2504 8 NA <NA> 19388.83
1797 2504 9 NA <NA> 23814.61
1798 2504 10 NA <NA> 15438.43
1799 2504 11 NA <NA> 20388.20
1800 2504 12 NA <NA> 27398.28
Calculer des statistiques descriptives
Il peut être utile de savoir comment calculer une statistique (mean, min, max, etc.) sur un sous-groupe de données, lequel est défini comme facteur. Pour ce faire avec dplyr, on regroupe d’abord les données avec group_by, puis on utilise la fonction summarize pour calculer
# Combinaison group_by + summarize dans `dplyr`donnees |>group_by(EmpID) |># nom de facteur(s)summarize(somme_nSales =sum(nSales, na.rm =TRUE),somme_TotSales =sum(TotSales, na.rm =TRUE))
Si le paquet dplyr offre des fonctionalités et une syntaxe conviviale, il y a plusieurs fonctions de base de R qui peuvent être très utiles.
Sélection de variables et d’observations
La fonction subset permet à la fois de sélectionner certaines observations remplissant une condition logique, mais aussi de sélectionner certaines colonnes. Voici deux exemples:
Il existe deux fonctions de base qui permettent de combiner des tables de données par lignes (fonction rbind, auquel cas le nombre de colonnes des deux tableaux est supposé être le même) ou bien par colonne (fonction cbind, auquel cas le nombre de lignes est supposé être le même). Voici un petit exemple d’utilisation de ces fonctions:
Finalement, vous pouvez utiliser aussi la fonction merge qui permet elle aussi de combiner des tables de données selon des colonnes spécifiques. Voici un exemple:
emp_comb <-rbind(partie1, data.frame(partie2, Team="B"))sales_merge2 <-merge(x = emp_comb, y = partie3, by =c("EmpID", "Month"), all =TRUE)head(sales_merge2)
EmpID Month nSales Team TotSales
1 100 1 16 A 15687.46
2 100 10 13 A 12928.39
3 100 11 19 A 19046.06
4 100 12 21 A 19194.89
5 100 2 21 A 21496.56
6 100 3 11 A 12015.78
tail(sales_merge2)
EmpID Month nSales Team TotSales
1795 908 4 21 A 19258.47
1796 908 5 29 A 25121.55
1797 908 6 24 A 20892.45
1798 908 7 26 A 23665.94
1799 908 8 25 A 22634.97
1800 908 9 27 A 24878.33
Agrégation de données
La fonction aggregate permet de faire cela, et voici un exemple de code:
# Fonction `aggregate` (R de base)with(donnees,aggregate(cbind(nSales, TotSales) ~ EmpID, FUN = sum, na.rm =TRUE))