Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
r_atelier2 [2016/10/21 10:45]
vincent_fugere [Ateliers R du CSBQ]
r_atelier2 [2018/10/16 20:47] (current)
mariehbrice [Atelier 2 : Charger et manipuler des données]
Line 10: Line 10:
 Développé par : Johanna Bradie, Vincent Fugère, Thomas Lamy Développé par : Johanna Bradie, Vincent Fugère, Thomas Lamy
  
-**Résumé :** Durant cet atelier, vous apprendrez comment charger et visualiser des données dans R. Vous apprendrez certaines fonctions permettant d’examiner vos données et vous apprendrez comment corriger certaines erreurs communes se produisant lors du chargement des données. Finalement, vous verrez l’importance de sauvegarder votre travail dans un script R, soit un fichier texte contenant tous vos codes et permettant de refaire toutes vos analyses en appuyant sur une seule touche(ou deux, ou trois peut-être…)+**Résumé :** Durant cet atelier, vous apprendrez comment charger et visualiser des données dans R. Vous apprendrez certaines fonctions permettant d’examiner vos données et vous apprendrez comment corriger certaines erreurs communes se produisant lors du chargement des données. Finalement, vous verrez l’importance de sauvegarder votre travail dans un script R, soit un fichier texte contenant tous vos codes et permettant de refaire toutes vos analyses en appuyant sur une seule touche (ou deux, ou trois peut-être…). Ensuite, nous présenterons tidyr et dplyr pour vous aider à transformer et à gérer le format de vos données ainsi que pour appliquer des fonctions simples ou complexes sur des sous-groupes de vos jeux de données. Cet atelier s’avérera utile non seulement pour les participants suivant notre série d’ateliers,​ mais également pour ceux et celles d’entre vous connaissant déjà le langage R et cherchant à maîtriser des outils plus avancés pour l'​analyse et la visualisation de vos données.
  
-Lien vers la présentation Prezi associée ​: [[http://​prezi.com/​8qxowa3378ju/​csbq-atelier-r-2/​|Prezi]]+**Lien vers la nouvelle [[https://​qcbsrworkshops.github.io/​Workshops/​workshop02/​workshop02-fr/​workshop02-fr.html|présentation Rmarkdown]]** 
 + 
 +//S'il vous plaît essayez-la et dites aux coordonnateurs des ateliers R ce que vous en pensez!// 
 + 
 +Lien vers l'​ancienne ​[[http://​prezi.com/​8qxowa3378ju/​csbq-atelier-r-2/​|présentation ​Prezi]]
  
 Téléchargez les scripts et les données requis pour cet atelier :  Téléchargez les scripts et les données requis pour cet atelier : 
Line 21: Line 25:
 ===== Objectifs d'​apprentissage ===== ===== Objectifs d'​apprentissage =====
  
 +  - Créer un projet RStudio
   - Écrire un script dans R   - Écrire un script dans R
   - Charger, explorer et enregister des données   - Charger, explorer et enregister des données
-  - Réparer ​un jeu de données "endommagé"+  - Manipuler des jeux de données avec tidyr, dplyr, maggritr 
 + 
 +===== Les projets RStudio ===== 
 + 
 +Qu-est-ce qu'un projet RStudio? 
 +  * Les projets RStudio permettent l'​organisation de son travail et l'​accès facile à tous les fichiers requis pour une analyse. 
 +  * Tout fichier, script, et documentation utilisé pour une analyse sont reliés et regroupés ensemble dans un même projet. 
 + 
 +L'​utilisation de projets RStudio facilite aussi la reproducibilité et le partage ​de données, de scripts, et de leur documentation. 
 + 
 +===== Créer un projet dans RStudio =====  
 + 
 +Pour créer un projet dans RStudio, allez dans le menu //Fichier// puis sélectionnez ​"Nouveau projet"
 + 
 +{{:​0_create_a_new_project.png?​400|}} 
 +===== Organiser ses fichiers ===== 
 + 
 +Un projet = un dossier! 
 + 
 +{{:​0_folderdata1.png?​400|}}  
 + 
 +===== Préparer des données pour l'​importation dans R ===== 
 + 
 +  * Vous devriez enregistrez les fichiers à importer dans R en tant que fichiers **"​comma separated values"​ (.csv)** 
 +  * Les fichiers .csv peuvent être créés par presque toutes les applications (Excel, GoogleDocs, LibreOffice,​ etc.)  
 +  * Fichier -> Enregistrer sous: .csv 
 + 
 +==== Bien nommer les fichiers ==== 
 + 
 +  * Oui:  
 +    * rawDatasetAgo2017.csv 
 +    * co2_concentrations_QB.csv 
 +    * 01_figIntro.R 
 +  * Non: 
 +    * final.csv ​ //(Pas informatif!)//​ 
 +    * safnnejs.csv ​ //​(C'​est n'​importe quoi!)// 
 +    * 1-4.csv ​ //(Éviter d'​utiliser des chiffres!)//​ 
 +    * Dont.separate.names.with.dots.csv ​ //(Peut causer des erreurs de lecture de fichier!)//​ 
 + 
 +==== Bien nommer les variables ==== 
 + 
 +  * Utilisez des noms de variables courts et informatifs (//i.e.// "​Temps_1"​ au lieu de "Temps de la premiere mesure"​)  
 +    * Oui: "​Mesure",​ "​NomEspece",​ "​Site"​ 
 +  * Les valeurs des colonnes doivent correspondre à l'​usage prévu 
 + 
 +==== Conseils pour la préparation de jeux de données ==== 
 + 
 +  * Pas de texte dans les colonnes de mode numérique (ceci inclut les espaces !) 
 +  * Identifiez les valeurs manquantes par NA ("not available"​) - notez le majuscule! 
 +  * **Faites attention aux erreurs typographiques!** 
 +  * Évitez les valeurs numériques pour les variables n'​ayant pas vraiment de valeur numérique (//i.e.// individu, réplicat, traitement) 
 +    * Par exemple, identifiez vos individus par "​A,​B,​C"​ ou "​ind1,​ind2,​ind3"​ au lieu de "​1,​2,​3"​ 
 +  * Utilisez un format uniforme pour les dates, les chiffres, etc. 
 +  * N'​ajoutez pas de notes, d'​en-têtes supplémentaires,​ ou de cellules fusionnées! 
 +  * Seulement une variable par colonne! 
 + 
 +==== Exemples de mauvaises habitudes ==== 
 + 
 +{{:​excel_notes.png|}} 
 +{{:​horribledata.png|}} 
 + 
 +Il est possible de faire toute la préparation des données dans R. Les avantages sont :  
 +  * On économise du temps pour les grosses bases de données 
 +  * On préserve les données d'​origine 
 +  * On peut basculer entre les modes "​long"​ et "​large"​ très facilement (plus de détails plus tard) 
 +  * Pour des informations complémentaires,​ consultez la page suivante : [[https://​www.zoology.ubc.ca/​~schluter/​R/​data/​]]
  
 ===== Écrire un script dans R ===== ===== Écrire un script dans R =====
Line 31: Line 101:
 Afin d'​utiliser un script dans RStudio, il suffi simplement de surligner une commande et appuyer sur "​Run"​ ou appuyer sur "​command-enter"​ (Mac) ou "​ctrl-enter"​ (PC). Afin d'​utiliser un script dans RStudio, il suffi simplement de surligner une commande et appuyer sur "​Run"​ ou appuyer sur "​command-enter"​ (Mac) ou "​ctrl-enter"​ (PC).
  
 +{{:​1_create_an_r_script.png?​500|}}
 +{{:​2_create_an_r_script2.mod_arrow.png?​600|}}
 ==== Commandes & Commentaires ==== ==== Commandes & Commentaires ====
  
Line 62: Line 134:
  
 RStudio affiche une petite flèche juste à côté du numéro de ligne où l'​en-tête de section a été créé. Si vous cliquez sur la flèche, cette partie du script sera cachée. RStudio affiche une petite flèche juste à côté du numéro de ligne où l'​en-tête de section a été créé. Si vous cliquez sur la flèche, cette partie du script sera cachée.
 +
 +Vous pouvez aussi naviguer entre sections en utilisant le menu trouvé en bas de la fenêtre du script.
 +
 +{{:​4_section_headings_mod_arrow_2.png?​600|}}
 +
 ==== Nettoyage ==== ==== Nettoyage ====
  
Line 108: Line 185:
 </​code>​ </​code>​
  
-Lorsque vous chargez un script, R définit le répertoire de travail comme étant ​celui qui contient le script.+Lorsque vous chargez un script, R définit le répertoire de travail comme étant ​le dossier ​qui contient le script.
  
-Afin de spécifier ​un chemin d'​accès, ​il faut utilise ​le "/"​ pour séparer les dossiers, sous-dossiers et noms de fichiers.+Afin de spécifier ​le chemin d'​accès ​du répertoire avec la fonction ''​setwd()''​utilisez ​le "/"​ pour séparer les dossiers, sous-dossiers et noms de fichiers. Vous pouvez aussi cliquer sur session / Définir le répertoire / Choisir le répertoire.
  
-Il y a plusieurs façons de définir un répertoire de travail : +====Afficher ​le contenu ​du répertoire de travail====
-  * Vous pouvez simplement taper le chemin d'​accès complet ​du répertoire ​entre les parenthèses ​de la fonction ''​setwd()''​. Par exemple : +
-<code rsplus | > +
-setwd('/​Users/​vincentfugere/​Desktop/​QCBS_R_Workshop2'​) ​ # Exemple pour Mac  +
-setwd('​C:/​Users/​Johanna/​Documents/​PhD/​R_Workshop2'​) ​  # Exemple pour Windows +
-# **Prenez note que cet exemple ne fonctionnera PAS sur votre ordinateur ! +
-</​code>​ +
-  * Vous pouvez utiliser la fonction ''​choose.dir()''​. Une fenêtre contextuelle apparaîtra pour vous permettre de sélectionner un répertoire approprié. +
-<code rsplus | > +
-setwd(choose.dir()) ​ # Prenez note que cette commande peut ne pas fonctionner sur un Mac. +
-</​code>​ +
-  * Vous cliquez sur session / Définir le répertoire / Choisir le répertoire+
  
-====Afficher Le Contenu du Répertoire De Travail==== 
 La fonction ''​dir()''​ affiche le contenu du répertoire de travail. ​ La fonction ''​dir()''​ affiche le contenu du répertoire de travail. ​
 <code rsplus | > <code rsplus | >
 dir() # Cette commande vous indique le contenu du répertoire dans lequel vous vous trouvez. dir() # Cette commande vous indique le contenu du répertoire dans lequel vous vous trouvez.
 </​code>​ </​code>​
-Vous pouvez ​contrôler+Vous pouvez ​vérifier
-  * Si le fichier que vous projetez d'ouvrir se trouve dans le répertoire de travail ou non+  * Si le fichier que vous voulez ​ouvrir se trouve dans le répertoire de travail ou non
   * L'​orthographe du nom du fichier (//e.g.// '​monfichier.csv'​ au lieu de '​MonFichier.csv'​)   * L'​orthographe du nom du fichier (//e.g.// '​monfichier.csv'​ au lieu de '​MonFichier.csv'​)
  
-==== Importer ​des données ====+==== Importer ​un jeu de données ====
  
 Utilisez la fonction ''​read.csv()''​ pour importer des données provenant d'un fichier .csv dans R. Utilisez la fonction ''​read.csv()''​ pour importer des données provenant d'un fichier .csv dans R.
Line 163: Line 228:
  
 NOTE : Si vous utilisez un système d'​exploitation en français ou un éditeur CSV, il est possible que vous deviez utiliser la fonction ''​read.csv2()''​ au lieu de la fonction ''​read.csv()''​ pour importer correctement un fichier. NOTE : Si vous utilisez un système d'​exploitation en français ou un éditeur CSV, il est possible que vous deviez utiliser la fonction ''​read.csv2()''​ au lieu de la fonction ''​read.csv()''​ pour importer correctement un fichier.
-==== Visualiser des données ====+ 
 +{{:​5_importing_data_mod_arrow.png?​900|}} 
 + 
 +Prenez note que RStudio montre maintenant le jeu de donné CO2 dans ton espace de travail. L'​espace de travail inclut tous les objets créés pendant ta session R. 
 +==== Explorer le jeu de données ====
  
 Le jeu de données "​CO2"​ contient des mesures répétées d'​absorption de CO<​sub>​2</​sub>​ prises sur six plantes du Québec et six plantes du Mississippi à différentes concentrations de CO<​sub>​2</​sub>​ ambiant. La moitié des plantes de chaque région a subi un traitement de refroidissement la veille du début de l'​expérience. Le jeu de données "​CO2"​ contient des mesures répétées d'​absorption de CO<​sub>​2</​sub>​ prises sur six plantes du Québec et six plantes du Mississippi à différentes concentrations de CO<​sub>​2</​sub>​ ambiant. La moitié des plantes de chaque région a subi un traitement de refroidissement la veille du début de l'​expérience.
  
-Voici quelques ​commandes ​utiles pour visualiser le jeu de données importé :+Voici quelques ​fonctions ​utiles pour visualiser le jeu de données importé :
 |CO2| Affiche le tableau de données complet dans la console| |CO2| Affiche le tableau de données complet dans la console|
 |head(CO2)| Affiche les premières lignes du tableau de données| |head(CO2)| Affiche les premières lignes du tableau de données|
Line 192: Line 261:
 Vérifiez la structure des données avec la fonction ''​str()''​. Quel est le problème ? Chargez les données de nouveau, mais cette fois-ci avec l'​argument ''​header=TRUE''​ avant de continuer. Vérifiez la structure des données avec la fonction ''​str()''​. Quel est le problème ? Chargez les données de nouveau, mais cette fois-ci avec l'​argument ''​header=TRUE''​ avant de continuer.
  
-==== Rappel de l'​atelier 1 : accéder ​aux données ====+==== Rappel de l'​atelier 1 : Accéder ​aux données ====
  
 Les données peuvent être extraites d'un jeu de données de plusieurs façons. Considerons un jeu de données nommé //mydata//. Les crochets permettent d'​extraire le contenu d'une cellule. Les données peuvent être extraites d'un jeu de données de plusieurs façons. Considerons un jeu de données nommé //mydata//. Les crochets permettent d'​extraire le contenu d'une cellule.
 +
 +{{:​table_reminder_from_workshop_1_accessing_data.png?​500|}}
  
 <code rsplus | > <code rsplus | >
Line 205: Line 276:
 </​code>​ </​code>​
  
-Si le numéro de la ligne est omis, toute la colonne est extraite. De même, le symbôle ''​$''​ suivi de l'en-tête ​de la colonne peut être utilisé.+Si le numéro de la ligne est omis, toute la colonne est extraite. De même, le symbôle ''​$''​ suivi d'un nom de colonne peut être utilisé.
 <code rsplus | > <code rsplus | >
 mydata[,1] # extrait le contenu de la première colonne mydata[,1] # extrait le contenu de la première colonne
-mydata$en-tête ​# extrait le contenu de la colonne ​dont l'​en-tête correspond+mydata$Variable1 ​# extrait le contenu de la colonne ​"​Variable1"​
 </​code>​ </​code>​
  
-==== Exploration des données ​====+==== Changer les noms de variables ​====
  
-Ça peut être très utile de représenter les variables ​graphiquement pour examiner les données.+On peut changer le nom de variables ​(colonnes) dans R.
  
 <code rsplus | > <code rsplus | >
-plot(CO2) ​Fait des graphiques ​de toutes ​les combinaisons de variables+Créer une copie du jeu de données qu'on pourra modifier 
 +CO2copy <- CO2 
 +# names() donne les noms des variables ​présents dans le jeu de données ​  
 +names(CO2copy) 
 + 
 +# Changer des noms anglais à des noms français 
 +names(CO2copy) <- c("​Plante","​Categorie",​ "​Traitement",​ "​conc","​absortion"​)
 </​code>​ </​code>​
  
-Pour vérifier si une variable est distribuée normalementutilisez ​la fonction ''​hist()'' ​:+==== Créer des nouvelles variables ==== 
 + 
 +On peut facilement créer et produire des nouvelles variables. Par exemple, la fonction ''​paste()'' ​permet la concaténation de chaînes de caractères et de variables. 
 <code rsplus | > <code rsplus | >
-hist(CO2$uptake) # Le symbole $ permet ​d'extraire une colonne spécifique par son nom.+# Créer un ID unique pour les échantillons avec la fonction ''​paste()''​ 
 +Consultez ?paste et ?paste0 
 +# N'​oubliez pas d'utiliser ""​ pour les chaînes de caractères 
 +CO2copy$uniqueID <- paste0(CO2copy$Plante,"​_",​ CO2copy$Categorie,​ "​_",​ CO2copy$Traitement) 
 + 
 +# Observer les résultats  
 +head(CO2copy$uniqueID)
 </​code>​ </​code>​
  
 +On peut aussi créer des nouvelles variables à partir de chiffres et d'​opérations mathématiques!
  
-Plusieurs fonctions intégrées à R vous permettent ​d'obtenir ​de l'​information sur vos données. Les fonctions ​''​mean()''​ et ''​sd()''​ sont couramment utilisées.+<code rsplus | > 
 +# Standardizer la variable "​absortion"​ en valeurs relatives 
 +CO2copy$absortionRel = CO2copy$absortion/​max(CO2copy$absortion)  
 + 
 +# Observer les résultats 
 +head(CO2copy$absortionRel) 
 +</​code>​ 
 + 
 +====Extraire un sous-ensemble ​d'un jeu de données==== 
 + 
 +Il y a plusieurs façons d'extraire un sous-ensemble d'un jeu de données.
  
 <code rsplus | > <code rsplus | >
-conc_mean<​-mean(CO2$conc) ​Calcule la moyenne ​de la colonne ​"conc" ​de l'​objet "​CO2"​ +Continuons avec notre trame de données ​"CO2copy"
-                          # Enregistré en tant que "​conc_mean"​ +
-conc_mean # Affiche l'​objet "​conc_mean"​ dans la console+
  
-conc_sd<​-sd(CO2$conc) # Calcule l'​écart-type de la colonne "​conc" ​et l'enregistre en tant que "conc_sd+## Extraire un sous-ensemble par un nom de variable  
-conc_sd+CO2copy[,​c("​Plante",​ "​absortionRel"​)] # Extrait seulement les colonnes nommées "​Plante"​ et "​absortionRel"​. (N'​oubliez pas ","​!) 
 + 
 +## Extraire un sous-ensemble de rangées  
 +CO2copy[1:​50,​] # Extraite les rangées de 1 à 50 
 + 
 +### Extraire un sous-ensemble correspondant à un facteur  
 +CO2copy[CO2copy$Traitement == "​nonchilled",​] # Extraire les observations correspondant seulement au traitement "​nonchilled"​.  
 + 
 +### Extraire un sous-ensemble correspondant à une condition numérique  
 +CO2copy[CO2copy$absortion >= 20, ] # Extraire les observations ayant une absortion plus grande ou égale à 20   
 + 
 +### Les conditions peuvent être complémentaires en utilisant "&"​ 
 +CO2copy[CO2copy$Traitement == "​nonchilled"​ & CO2copy$absortion >= 20, ] 
 + 
 +# Nous avons fini de modifier la copie du jeu de données CO2copy. On peut alors l'​effacer. 
 +CO2copy <- NULL 
 +</​code>​ 
 + 
 +Consultez [[https://​stat.ethz.ch/​R-manual/​R-devel/​library/​base/​html/​Logic.html| here]] pour voir les opérateurs logiques pouvant être utilisés pour extraire des sous-ensembles de données dans R. 
 +==== Explorer les données ==== 
 + 
 +Pour faire une première exploration de données, on peut rapidement calculer des statistiques de base avec la fonction ''​summary()''​. 
 + 
 +<code rsplus | > 
 +summary(CO2) # calculer les statistiques sommaires du jeu de données 
 +</​code>​ 
 + 
 +Plusieurs fonctions intégrées à R vous permettent d'​obtenir de l'​information supplémentaire sur vos données. Les fonctions ''​mean()'',​ ''​sd()'',​ ''​hist()'',​ et ''​print()''​ sont couramment utilisées. 
 + 
 +<code rsplus | > 
 +# Calculer la moyenne et l'​écart type des données dans la colonne "​conc"​ de l'​objet CO2 
 +meanConc<​-mean(CO2$conc) # Calcule la moyenne de la colonne "​conc"​ de l'​objet "​CO2"​ 
 +sdConc<​-sd(CO2$conc) # Calcule l'​écart-type de la colonne "​conc" ​ 
 +</​code>​ 
 + 
 +# print() sort une valeure dans la console R 
 +print(paste("​la concentration moyenne est:", meanConc)) 
 +print(paste("​l'écart type de la concentration est:", sdConc)) 
 + 
 +# Produisez un histogramme to explore the distribution of "​uptake
 +hist(CO2$uptake) 
 + 
 +# Augmenter le nombre de classes pour mieux observer la distribution 
 +hist(CO2$uptake,​ breaks = 40)
 </​code>​ </​code>​
  
Line 242: Line 380:
 </​code>​ </​code>​
  
-Afin d'utiliser la fonction ''​apply()'',​ trois arguments doivent être spécifiés. Le premier argument est le jeu de données sur lequel on veut appliquer une fonction. Le deuxième argument spécifie si la fonction est appliquée aux lignes (''​MARGIN = 1''​) ou aux colonnes (''​MARGIN = 2''​). Le dernier argument spécifie la fonction à appliquer. Par exemple :+ 
 +Pour utiliser la fonction ''​apply()'',​ trois arguments doivent être spécifiés. Le premier argument est le jeu de données sur lequel on veut appliquer une fonction. Le deuxième argument spécifie si la fonction est appliquée aux lignes (''​MARGIN = 1''​) ou aux colonnes (''​MARGIN = 2''​). Le dernier argument spécifie la fonction à appliquer. Par exemple :
  
 <code rsplus | > <code rsplus | >
Line 256: Line 395:
 save.image(file="​CO2_project_Data.RData"​) # L'​espace de travail est enregistré save.image(file="​CO2_project_Data.RData"​) # L'​espace de travail est enregistré
  
-rm(list=ls()) ​ # Ça nettoie ​l'​espace de travail+rm(list=ls()) ​ # Nettoyer ​l'​espace de travail
  
-load("​CO2_project_Data.RData"​) # On charge ​tout ce qui se trouvait dans l'​espace de travail+load("​CO2_project_Data.RData"​) # Charger ​tout ce qui se trouvait dans l'​espace de travail
  
-head(CO2) # Ça marche ​:)+head(CO2) # Ça fonctionne! ​:)
 </​code>​ </​code>​
-==== Exporter ​des données ====+==== Exporter ​le jeu de données ====
 Si vous voulez enregistrer des données que vous avez créées ou modifiées dans R, utilisez la fonction ''​write.csv()''​. Le fichier ainsi créé sera enregistré dans le répertoire de travail. Si vous voulez enregistrer des données que vous avez créées ou modifiées dans R, utilisez la fonction ''​write.csv()''​. Le fichier ainsi créé sera enregistré dans le répertoire de travail.
  
Line 268: Line 407:
 write.csv(CO2,​file="​CO2_new.csv"​) # L'​objet CO2 est enregistré dans le fichier nommé CO2_new.csv write.csv(CO2,​file="​CO2_new.csv"​) # L'​objet CO2 est enregistré dans le fichier nommé CO2_new.csv
 </​code>​ </​code>​
-==== Préparer des données pour l'​importation dans R ==== 
  
-  * Lors de la préparation de fichiers à importer dans R, vous devriez les enregistrez en tant que fichiers .csv 
-  * Presque toutes les applications (Excel, GoogleDocs, LibreOffice,​ etc.) peuvent enregistrer au format .csv ("​comma separated values"​) 
-  * Utilisez des noms de variables courts et informatifs (//i.e.// "​Temps_1"​ au lieu de "Temps de la premiere mesure"​) ​ 
-  * Les valeurs des colonnes doivent correspondre à l'​usage prévu 
-  * Pas de texte dans les colonnes de mode numérique (ceci inclut les espaces !) 
-  * Identifiez les valeurs manquantes par NA 
-  * Évitez les valeurs numériques pour les variables n'​ayant pas vraiment de valeur numérique (//i.e.// individu, réplicat, traitement) 
-    * Par exemple, identifiez vos individus par "​A,​B,​C"​ ou "​ind1,​ind2,​ind3"​ au lieu de "​1,​2,​3"​ 
-  * N'​ajoutez pas de notes, d'​en-têtes supplémentaires ou de cellues fusionnées ! 
  
-Il est possible de faire toute la préparation des données dans R. Les avantages sont  +==== DÉFIUtilisez vos propres ​données ​====
-  * Ça économise du temps pour les grosses bases de données +
-  * Ça préserve les données d'​origine +
-  * Ça permet de basculer entre les modes "​long"​ et "​large"​ très facilement (plus de détails dans l'​atelier 4) +
-  * Pour des informations complémentaires,​ consultez la page suivante : [[https://​www.zoology.ubc.ca/​~schluter/​R/​data/​]]+
  
-==== Utilisez vos propres ​données ====+Essayez de charger, explorer, et enregistrer vos propres données dans R. 
 +Est-ce que le chargement fonctionne ?  Si ce n'est pas le cas, essayez d'​arranger vos données dans Excel. Enregistrez vos données "​arrangées"​ et essayez de les ouvrir dans R. 
 +==== Réparer un jeu de données ====
  
-**Défi R**+Les jeux de données peuvent être désordonnés et incompatibles entre certains systèmes (Mac, Windows) ou entre ordinateurs.
  
-Essayez de charger, explorer, représenter graphiquement et enregistrer vos propres données dans R. +Pratiquons-nous à réparer certains problèmes communs.
-Est-ce que le chargement fonctionne ?  Si ce n'est pas le cas, essayez d'​arranger vos données dans Excel. Enregistrez vos données "​arrangées"​ et essayez de les ouvrir dans R. +
-===== Réparer un jeu de données "​endommagé"​ =====+
  
-**Défi R plus difficile**+====DÉFI: Réparer un jeu de données "​endommagé"​====
  
 Importez un jeu de données "​endommagé"​ dans R et trouvez les problèmes. Importez un jeu de données "​endommagé"​ dans R et trouvez les problèmes.
  
 <code rsplus | > <code rsplus | >
-CO2<​-read.csv("​CO2_broken.csv"​) # On écrase ​l'​ancien objet CO2 et on le remplace ​avec le contenu +CO2<​-read.csv("​CO2_broken.csv"​) # On remplace ​l'​ancien objet CO2 avec le contenu d'un nouveau jeu de données 
-                                # d'un nouveau jeu de données +head(CO2) # C'est le désordre! 
-head(CO2) # Ça semble en désordre +CO2
-CO2 # En effet !+
 </​code>​ </​code>​
  
   * Vos données ressemblent probablement à ça !   * Vos données ressemblent probablement à ça !
-  * Réparez le jeu de données dans R (ou pas)+  * Réparez le jeu de données dans R 
   * Faites un essai avant de regarder la solution   * Faites un essai avant de regarder la solution
   * Entraidez-vous entre voisins et amusez-vous :)   * Entraidez-vous entre voisins et amusez-vous :)
Line 323: Line 447:
 Rappelez-vous que vous pouvez obtenir de l'aide en utilisant "?"​ (//e.g.// ''?​str''​). Rappelez-vous que vous pouvez obtenir de l'aide en utilisant "?"​ (//e.g.// ''?​str''​).
  
-Indice : Il y a quatre problèmes avec ce jeu de données ! +**Indice : Il y a quatre problèmes avec ce jeu de données!**
- +
-Réponses :+
  
 Réponse #1 Réponse #1
Line 371: Line 493:
 Solution : Solution :
 <​hidden>​ <​hidden>​
 +<code rsplus | >
 +?read.csv
 +</​code>​
 +{{:​read_table_help1.png|}}
 +{{:​read_table_help2.png|}}
 +
 <code rsplus | > <code rsplus | >
 CO2 <- read.csv("​CO2_broken.csv",​sep = "",​skip = 2,​na.strings = c("​NA","​na","​cannot_read_notes"​)) ​ CO2 <- read.csv("​CO2_broken.csv",​sep = "",​skip = 2,​na.strings = c("​NA","​na","​cannot_read_notes"​)) ​
 </​code>​ </​code>​
  
-En identifiant "​cannot_read_notes"​ comme valeur manquante (//i.e.// NA), R peut maintenant ces colonnes correctement. +En identifiant "​cannot_read_notes"​ comme valeur manquante (//i.e.// NA), R peut maintenant ces colonnes correctement. Rappelez-vous que NA signifie "Not available"​.
-Rappelez-vous que NA signifie "Not available"​.+
  
 <code rsplus | > <code rsplus | >
 head(CO2) head(CO2)
-str(CO2) # La variable '​conc'​ est maintenant de type '​integer'​ (nombre entier)et la variable '​uptake'​ est maintenant de type numérique.+str(CO2) # La variable '​conc'​ est maintenant de type '​integer'​ (nombre entier) et la variable '​uptake'​ est maintenant de type numérique.
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
Line 417: Line 544:
 </​hidden>​ </​hidden>​
 </​hidden>​ </​hidden>​
 +
 +
 +----
 +
 +=====Manipuler ses données avec tidyr, dyplr, maggritr=====
 +
 +===== Utiliser "​tidyr"​ pour réorganiser ses données =====
 +
 +{{:​tidyrsticker.png?​200|}}
 +
 +==== Pourquoi réorganiser ses données? ====
 +
 +La réorganisation permet de modifier la structure des données tout en préservant l'​information contenue dans le jeu de données. Plusieurs fonctions dans R exigent ou fonctionnent mieux avec une structure de données qui n'est pas nécessairement propice à la lecture par l'oeil humain.
 +
 +En comparaison à l'​agrégation,​ où plusieurs cellules sont regroupées pour créer un nouveau jeu de données (e.g. tableau des moyennes de plusieurs variables), la réorganisation maintient le même nombre de cellules. Le paquet ''​tidyr''​ permet de réorganiser nos jeu de données dans un format idéal pour nos tâches en aval, et ce à l'aide d'une syntaxe simple et logique.
 +
 +Commençons par installer et charger le paquet ''​tidyr''​ :
 +<code rsplus | >
 +if(!require(tidyr)){install.packages("​tidyr"​)}
 +library(tidyr)
 +</​code>​
 +
 +====Données en longueur vs. en largeur====
 +
 +Un jeu de données **en largeur** contient une colonne pour chaque variable ou facteur inclus dans les données. Une rangée peut alors comprendre plusieurs observations différentes.
 +
 +Un jeu de données **en longueur** contient une colonne par variable, où chaque rangée s'agit d'une observation unique. Le format "​long"​ est plus "​propre"​ (//tidy// en anglais), parce que les données sont plus facilement interprétées par ''​R''​ pour nos visualisations et nos analyses. ​
 +
 +Le format de vos données dépend de vos besoins d'​analyse et de visualisation,​ mais certains paquets et fonctions, incluant ''​dplyr'',​ ''​lm()'',​ ''​glm()'',​ et ''​gam()'',​ nécessitent des données en longueur. Le paquet ''​ggplot2''​ peut utiliser des données en largeur pour des visualisations simples, mais fonctionne mieux avec des données en longueur pour des visualisations plus complexes (exemple à venir).
 +
 +De plus, les données en format long peuvent être agrégées et réorganisées en format large afin de produire des résumés ou de vérifier si un jeu de données est équilibré (i.e. avec le même nombre d'​observations par traitement).
 +
 +On peut utiliser le paquet ''​tidyr''​ pour manipuler la structure d'un jeu de données en préservant toutes les informations d'​origine à l'aide des fonctions suivantes:
 +
 +  * 1. "​rassembler"​ les données (//gather data// en anglais; large --> long)
 +  * 2. "​disperser"​ les données (//spread data// en anglais; long --> large)
 +
 +
 +{{:​gather-spread.png?​600|}}
 +
 +
 +Supposons que vous envoyez votre assistant de terrain pour faire la collecte de données des dimensions de plusieurs arbres sur un site de recherche, soit le diamètre à la hauteur de la poitrine (DHP) et la hauteur. Il/elle revient avec un jeu de donnés en format "​dégât"​ (format large):
 +
 +<code rsplus | >
 +> large <- data.frame(Species = c("​Chêne",​ "​Orme",​ "​Frêne"​),​
 +                          DHP = c(12, 20, 13),
 +                         Haut = c(56, 85, 55))
 +> large
 +  Species DHP Haut
 +1   ​Chêne ​ 12   56
 +2    Orme  20   85
 +3   ​Frêne ​ 13   55
 +</​code>​
 +
 +====gather():​ Rassembler les données en longueur====
 +
 +<code rsplus | >
 +?gather
 +</​code>​
 +
 +La plupart des paquets dans le "​Hadleyverse"​ requièrent un format long, c'​est-à-dire où chaque rangée est une observation unique, et chaque colonne est une variable. Utilisons la fonction ''​gather()''​ pour "​rassembler"​ nos données en longueur. ''​gather()''​ prend plusieurs colonnes et les empile dans deux colonnes: une colonne spécifiant la variable mesurée, et l'​autre spécifiant la mesure associée.
 +
 +La fonction ''​gather()''​ prend au moins 3 arguments:
 +  * **data**: le jeu de données (e.g. "​large"​)
 +  * **key**: le nom de la nouvelle colonne spécifiant la variable mesurée (e.g. "​dimension"​)
 +  * **value**: le nom de la nouvelle colonne spécifiant la mesure associée (e.g. "​cm"​)
 +  * **...**: les colonnes qu'on veut empiler dans le jeu de données (e.g. "​DBH",​ "​Haut"​)
 +
 +Voici une démonstration avec le jeu de données ''​large''​ utilisé précédemment,​ contenant les dimensions d'​arbres:​
 +
 +<code rsplus | >
 +# Rassembler les colonnes en rangées d'​observations uniques ​
 +
 +> long <- gather(large,​ dimension, cm, DHP, Haut)
 +> long
 +  Species dimension cm
 +1   ​Chêne ​      DHP 12
 +2    Orme       DHP 20
 +3   ​Frêne ​      DHP 13
 +4   ​Chêne ​     Haut 56
 +5    Orme      Haut 85
 +6   ​Frêne ​     Haut 55
 +</​code>​
 +
 +Essayons également avec le jeu de données ''​CO2''​. ​ On peut "​rassembler"​ les colonnes contant la concentration de CO2 (''​conc''​) et le CO2 absorbé (''​uptake''​) :
 +
 +<code rsplus | >
 +CO2.long <- gather(CO2, response, value, conc, uptake)  ​
 +head(CO2) ​
 +head(CO2.long) ​
 +tail(CO2.long)
 +</​code>​
 +
 +====spread():​ Disperser les données en largeur====
 +
 +<code rsplus | >
 +?spread
 +</​code>​
 +
 +La fonction ''​spread()''​ est l'​inverse de ''​gather()'':​ elle nous permet de transformer nos données en format large, en utilisant la même syntaxe. ''​spread()''​ prend 3 arguments principaux:
 +
 +  * **data**: le jeu de données (e.g. “long”)
 +  * **key**: nom de la colonne contenant les noms des variables (e.g. "​dimension"​)
 +  * **value**: nom de la colonne contenant les mesures associées aux variables (e.g. "​cm"​)
 +
 +<code rsplus | >
 +> large2 <- spread(long,​ dimension, cm)
 +> large2
 +  Species DHP Haut
 +1   ​Chêne ​ 12   56
 +2   ​Frêne ​ 13   55
 +3    Orme  20   85
 +</​code>​
 +
 +
 +====separate():​ séparer une colonne en deux (ou plusieurs) colonnes==== ​
 +
 +Il arrive parfois qu'un jeu de données contient plusieurs variables réunies dans une même colonne. Dans ces situations, la fonction ''​separate()''​ sépare la colonne pour que chacune des variables ait sa propre colonne.
 +
 +La fonction ''​separate()''​ prend 4 arguments, et sépare une colonne à partir d'une chaîne de caractères:​
 +  * **data**: le jeu de données (e.g. "​long"​)
 +  * **col**: nom de la colonne que nous voulons séparer ​
 +  * **into**: nom des nouvelles colonnes crées par la séparation
 +  * **sep**: le caractère ou la chaîne de caractères identifiant où séparer le contenu (e.g. " "​)  ​
 +
 +À titre d'​exemple,​ créons un jeu de données fictif sur les poissons et le zooplancton qui est mal organisé:
 +
 +<code rsplus | >
 +set.seed(8)
 +degat <- data.frame(id = 1:4,
 +                    trt = sample(rep(c('​controle',​ '​culture'​),​ each = 2)),
 +         ​zooplancton.T1 = runif(4),
 +             ​poisson.T1 = runif(4),
 +         ​zooplancton.T2 = runif(4),
 +             ​poisson.T2 = runif(4))
 +</​code>​
 +
 +Dans ce cas, on commence par "​rassembler"​ ce jeu de données en largeur en format long.
 +
 +<code rsplus | >
 +> degat.long <- gather(degat,​ taxa, count, -id, -trt)
 +> head(degat.long)
 +</​code>​
 +
 +Petit rappel rapide: ici, nous utilisons ''​-id''​ et ''​-trt'',​ qui est interprété par la fonction comme étant TOUTES les colonnes sauf ''​id''​ et ''​trt''​. Nous pourrions également énumérer chaque colonne comme ceci: ''​zooplancton.T1,​ poisson.T1, zooplancton.T2,​ poisson.T2''​.
 +
 +Le défi principal de ''​separate()''​ est de formuler une expression qui identifie le caractère sur lequel séparer la colonne. Dans notre exemple, nous voulons séparer le contenu de la colonne "​taxa"​ au point (''​.''​). Il faut donc utiliser un petit truc provenant des outils d'​expressions régulières pour travailler avec les chaînes de caractères (//​strings//​ en anglais): ​
 +
 +<code rsplus | >
 +> degat.long.sep <- separate(degat.long,​ taxa, into = c("​especes",​ "​temps"​),​ sep = "​\\."​)
 +> head(degat.long.sep)
 +  id      trt     ​especes temps     count
 +1  1 controle zooplancton ​   T1 0.3215092
 +2  2 controle zooplancton ​   T1 0.7189275
 +3  3  culture zooplancton ​   T1 0.2908734
 +4  4  culture zooplancton ​   T1 0.9322698
 +5  1 controle ​    ​poisson ​   T1 0.7691470
 +6  2 controle ​    ​poisson ​   T1 0.6444911
 +</​code>​
 +
 +Ici, notons que la syntaxe ''​\\.''​ est requise parce qu'un point seul (''​.''​) est une carte frime (un joker) pour plusieurs fonctions dans le langage ''​R''​. Les ''​\\''​ servent donc à indiquer qu'on fait référence au caractère "''​.''"​.
 +
 +====Récapitulatif:​ tidyr====
 +
 +''​tidyr''​ est un paquet qui réorganise la structure de jeux de données.
 +  * Convertir de **format large en format long** à l'aide de ''​gather()''​
 +  * Convertir de **format long en format large** ​ à l'aide de ''​spread()''​
 +  * Séparer et regrouper des colonnes à l'aide de ''​separate()''​ et de son inverse, ''​unite()''​
 +
 +Voici un aide-mémoire (//en anglais//) pour faciliter la manipulation de jeux de données avec ''​tidyr''​ et ''​dplyr'':​ [[https://​www.rstudio.com/​wp-content/​uploads/​2015/​02/​data-wrangling-cheatsheet.pdf]]
 +
 +====DÉFI: Utiliser tidyr pour convertir le format long en format large====
 +
 +//​Réorganisez le jeu de données ''​airquality''​ en format long (en rassemblant toutes les colonnes sauf "​Month"​ et "​Day"​). Ensuite, dispersez-le en format large pour retrouver le format original de ''​airquality''://​
 +
 +++++Solution| ​
 +<code rsplus | >
 +air.long <- gather(airquality,​ variable, value, -Month, -Day)
 +# Notez que la syntaxe ici indique qu'on veut "​rassembler"​ toutes les colonnes sauf "​Month"​ et "​Day"​
 +head(air.long)
 +air.wide <- spread(air.long , variable, value)
 +head(air.wide)
 +</​code>​
 +
 +Le tableau ''​air.wide''​ a le même format que le jeu de données d'​origine ''​airquality''​ (bien que l'​ordre des colonnes ne soit pas le même).
 +++++
 +
 +----
 +
 +===== Utiliser "​dplyr"​ pour manipuler les données =====
 +
 +{{:​dplyrsticker.png?​200|}}
 +
 +==== Introduction à dplyr ====
 +
 +Souvent, on doit faire appel à une gamme d'​outils complexes pour manipuler nos jeux de données. La mission de ''​dplyr''​ est de simplifier nos tâches de manipulation en regroupant toutes les opérations communes sous un même toit. Le résultat est une collection de fonctions ayant une syntaxe simple qu'on peut exécuter à l'aide de "​verbes"​ (ou fonctions) intuitifs. ​
 +
 +En plus d'​être facile à utiliser, le paquet ''​dplyr''​ est exceptionnel pour les raisons suivantes:
 +  * il peut traiter des grands jeux de données rapidement (écrit en langage ''​Cpp''​)
 +  * sa fonctionnalité est bien intégrée dans RStudio et dans les autres paquets du Hadleyverse
 +  * il peut établir des connections à des bases de données SQL, et traduire votre code en requête SQL
 +  * c'est le Batman des paquets ''​R''​ (maîtrise la peur des données et adopte des technologies avancées)
 +
 +Certaines fonctions de base dans R ressemblent à des fonctions dans ''​dplyr'',​ incluant: ''​split()'',​ ''​subset()'',​ ''​apply()'',​ ''​sapply()'',​ ''​lapply()'',​ ''​tapply()''​ and ''​aggregate()''​.
 +
 +Commençons par installer et charger le paquet ''​dplyr'':​
 +
 +<code rsplus | >
 +if(!require(dplyr)){install.packages("​dplyr"​)}
 +library(dplyr)
 +</​code>​
 +
 +Au coeur du paquet ''​dplyr'',​ on retrouve des "​verbes"​ essentiels qui nous permettent d'​accomplir la manipulation de données. Voici 4 verbes qui exécutent les opérations les plus communes:
 +
 +  * ''​select()''​ : sélectionne des colonnes dans un jeu de données
 +  * ''​filter()''​ : filtre des rangées suivant les critères spécifiés
 +  * ''​arrange()''​ : trie les données d'une colonne en ordre croissant ou décroissant
 +  * ''​mutate()''​ : crée une nouvelle colonne de données (ou transforme une colonne existante)
 +
 +Dans les exemples et les défis qui suivent, nous utiliserons les jeux de données ''​airquality''​ et ''​ChickWeight'',​ qui sont inclus dans R:
 +
 +<code rsplus | >
 +?airquality
 +data(airquality)
 +?​ChickWeight
 +data(ChickWeight)
 +</​code>​
 +
 +====select():​ Sélection de colonnes====
 +
 +{{:​select.png?​600|}}
 +
 +La syntaxe de la fonction ''​select()''​ est: ''​select(données,​ colonne1, colonne2, ...)''​. La majorité de fonctions ''​dplyr''​ suivent cette même syntaxe. ''​select()''​ prend alors au moins 2 arguments:
 +  * **data**: le jeu de données
 +  * **...**: noms ou positions de colonnes, ou expressions complexes (séparés par des virgules pour désigner les colonnes que l'on veut sélectionner
 +
 +Par exemple:
 +<code rsplus | >
 +select(données,​ colonne1, colonne2) # sélectionne colonne1 et colonne2
 +select(données,​ c(2:4,6) # sélectionne les colonnes 2 à 4, plus la 6ème colonne
 +select(données,​ -colonne1) # sélectionne toutes les colonnes sauf la 1ère 
 +select(données,​ start_with(x.)) # sélectionne les colonnes ayant un nom qui commence par "​x."​
 +</​code>​
 +
 +Voici d'​autres arguments utiles pour ''​select()'':​
 +
 +{{:​select.helper.png?​400|}}
 +
 +À titre d'​exemple,​ supposons qu'on s'​intéresse à la variation de la variable ''​Ozone''​ avec le temps. À l'aide de la fonction ''​select()'',​ on peut retenir uniquement les colonnes requises pour nos analyses :
 +
 +<code rsplus | >
 +> ozone <- select(airquality,​ Ozone, Month, Day)
 +> head(ozone)
 +  Ozone Month Day
 +1    41     ​5 ​  1
 +2    36     ​5 ​  2
 +3    12     ​5 ​  3
 +4    18     ​5 ​  4
 +5    NA     ​5 ​  5
 +6    28     ​5 ​  6
 +</​code>​
 +
 +====filter():​ Sélection de rangées====
 +
 +Souvent, on s'​intéresse seulement à un sous-ensemble de notre jeu de données. Pour extraire un sous-ensemble de rangées selon une condition, on peut utiliser la fonction ''​filter()''​ avec la syntaxe suivante: ''​filter(dataframe,​ proposition logique 1, proposition logique 2, ...)''​.
 +
 +{{:​filter.png?​600|}}
 +
 +On se rappelle que la réponse à une proposition logique est VRAI ou FAUX (TRUE or FALSE). La fonction ''​filter()''​ retient uniquement les rangées pour lesquelles la réponse à la proposition logique est VRAI. On peut aussi utiliser cette fonction sur des chaînes de caractères (//​strings//​) et des facteurs (//​factors//​). ​
 +
 +Voici un petit rappel du fonctionnement des propositions logiques dans R:
 +{{:​logic.helper.png?​500|}}
 +
 +Par exemple, supposons qu'on s'​intéresse aux périodes de canicules du mois d'​août dans le jeu de données ''​airquality''​ :
 +
 +<code rsplus | >
 +> aout <- filter(airquality,​ Month == 8, Temp >= 90)
 +> head(aout)
 +  Ozone Solar.R Wind Temp Month Day
 +1    89     229 10.3   ​90 ​    ​8 ​  8
 +2   ​110 ​    ​207 ​ 8.0   ​90 ​    ​8 ​  9
 +3    NA     ​222 ​ 8.6   ​92 ​    ​8 ​ 10
 +4    76     ​203 ​ 9.7   ​97 ​    ​8 ​ 28
 +5   ​118 ​    ​225 ​ 2.3   ​94 ​    ​8 ​ 29
 +6    84     ​237 ​ 6.3   ​96 ​    ​8 ​ 30
 +</​code>​
 +
 +====arrange():​ Triage de rangées====
 +
 +Parfois, on travaille avec des jeux de données qui doivent être analysés et/ou visualisés dans un ordre en particulier (//e.g.// série temporelle). ​
 +
 +La fonction ''​arrange()''​ permet de trier les rangées d'un jeu de données selon une ou plusieurs colonnes, suivant cette syntaxe: ''​arrange(données,​ variable1, variable2, ...)''​. ​
 +
 +Par défaut, les rangées sont réordonnées en ordre croissant (alphabétiquement ou numériquement). On peut également réordonner les rangées en ordre décroissant en enveloppant la variable d'​intérêt par la fonction ''​desc()''​ au sein de la fonction ''​arrange()'',​ comme ceci: ''​arrange(données,​ variable1, desc(variable2),​ ...)''​.
 +
 +Commençons par créer une version désordonnée de ''​airquality'':​
 +
 +<code rsplus | >
 +> air_degat <- sample_frac(airquality,​ 1)
 +> head(air_degat)
 +    Ozone Solar.R Wind Temp Month Day
 +21      1       ​8 ​ 9.7   ​59 ​    ​5 ​ 21
 +42     ​NA ​    259 10.9   ​93 ​    ​6 ​ 11
 +151    14     191 14.3   ​75 ​    ​9 ​ 28
 +108    22      71 10.3   ​77 ​    ​8 ​ 16
 +8      19      99 13.8   ​59 ​    ​5 ​  8
 +104    44     192 11.5   ​86 ​    ​8 ​ 12
 +</​code>​
 +
 +Maintenant, voici comment réarranger le jeu de données en ordre chronologique,​ soit en ordre croissant de ''​Month''​ et ensuite en ordre croissant de ''​Day''​ :
 +
 +<code rsplus | >
 +> air_chron <- arrange(air_degat,​ Month, Day)
 +> head(air_chron)
 +  Ozone Solar.R Wind Temp Month Day
 +1    41     ​190 ​ 7.4   ​67 ​    ​5 ​  1
 +2    36     ​118 ​ 8.0   ​72 ​    ​5 ​  2
 +3    12     149 12.6   ​74 ​    ​5 ​  3
 +4    18     313 11.5   ​62 ​    ​5 ​  4
 +5    NA      NA 14.3   ​56 ​    ​5 ​  5
 +6    28      NA 14.9   ​66 ​    ​5 ​  6
 +</​code>​
 +
 +Quelle est la différence quand on change l'​ordre des colonnes ciblées par la fonction?
 +<code rsplus | >
 +arrange(air_mess,​ Day, Month)
 +</​code>​
 +
 +====mutate():​ Créer des nouvelles colonnes====
 +
 +Avant même de passer au triage ou à l'​extraction d'un sous-ensemble de données, il faut souvent générer des nouvelles variables ou transformer des variables existantes. On peut utiliser la fonction ''​mutate()''​ pour créer et transformer des variables.
 +
 +La fonction ''​mutate()''​ suit la syntaxe suivante: ''​mutate(données,​ newVar1 = expression1,​ newVar2 = expression2,​ ...)''​.
 +
 +{{:​mutate.png?​600|}}
 +
 +Utilisons ''​mutate()''​ pour créer une nouvelle colonne. Par exemple, la température est en degrés Fahrenheit dans le jeu de données ''​airquality'',​ et nous voulons transformer la variable ''​Temp''​ en degrés Celsius:
 +
 +<code rsplus | >
 +> airquality_C <- mutate(airquality,​ Temp_C = (Temp-32)*(5/​9))
 +> head(airquality_C)
 +  Ozone Solar.R Wind Temp Month Day   ​Temp_C
 +1    41     ​190 ​ 7.4   ​67 ​    ​5 ​  1 19.44444
 +2    36     ​118 ​ 8.0   ​72 ​    ​5 ​  2 22.22222
 +3    12     149 12.6   ​74 ​    ​5 ​  3 23.33333
 +4    18     313 11.5   ​62 ​    ​5 ​  4 16.66667
 +5    NA      NA 14.3   ​56 ​    ​5 ​  5 13.33333
 +6    28      NA 14.9   ​66 ​    ​5 ​  6 18.88889
 +</​code>​
 +
 +Notez que dans notre exemple, la syntaxe est très simple. Cependant, à l'​intérieur d'un seul appel de la fonction ''​mutate()''​ on peut:
 +  * remplacer le contenu de colonnes existantes (en conservant le même nom)
 +  * créer plusieurs nouvelles colonnes ​
 +  * créer des nouvelles colonnes calculées à partir de variables créés en amont
 +
 +=====dplyr et magrittr, un don du ciel=====
 +
 +{{:​magrittrsticker.png?​200|}}
 +
 +Le paquet ''​magrittr''​ introduit un nouvel outil commun dans plusieurs langages informatiques : le **pipe**. Le "​pipe"​ (un tuyau en français) permet de relier nos fonctions en redirigeant la sortie (//​output//​) d'une fonction en amont vers l'​entrée (//input//) d'une fonction en aval. Le "​pipe"​ fournit par le paquet ''​magrittr''​ s'​écrit come ceci : ''​%>​%''​. Lorsqu'​on l'​utilise en combo avec ''​dplyr'',​ le "​pipe"​ de ''​magrittr''​ nous permet d'​accéder à la flexibilité et à toutes les fonctionnalités intéressantes du paquet. Pour vous familiariser avec ce type de flux de travail, nous utiliserons ''​dplyr''​ avec ''​magrittr''​ pour le restant de l'​atelier. ​
 +
 +Commençons par installer et charger le paquet :
 +
 +<code rsplus | >
 +if(!require(magrittr)){install.packages("​magrittr"​)}
 +library(magrittr)
 +</​code>​
 +
 +L'​utilisation de ''​magrittr''​ est très intuitif. Nous allons démontrer son fonctionnement en combinant les exemples ci-haut. Supposons qu'on veut créer un sous-ensemble de ''​airquality''​ pour le mois de juin, et ensuite convertir la variable de la température en degrés Celsius. Si on procède sans le "​pipe",​ soit une étape à la fois, notre code lirait comme suit :
 +
 +<code rsplus | >
 +juin_C <- mutate(filter(airquality,​ Month == 6), Temp_C = (Temp-32)*(5/​9))
 +</​code>  ​
 +
 +Ce code est plus difficile à lire parce que l'​ordre des opérations exécutées commence au centre et se lit vers l'​extérieur,​ jusqu'​à la fonction enveloppant le tout. Plus on ajoute des opérations,​ plus le code devient illisible. Au lieu d'​envelopper tous les fonctions, on peut écrire les opérations en ordre d'​exécutions et les relier à l'aide du "​pipe"​ ''​%>​%''​ :
 +
 +<code rsplus | >
 +juin_C <- airquality %>​% ​
 +    filter(Month == 6) %>%
 +    mutate(Temp_C = (Temp-32)*(5/​9))
 +</​code> ​
 +
 +Notez qu'au lieu de spécifier le jeu de données au sein de chaque fonction, on inscrit le jeu de données avant les opérations et on le "​pipe"​ jusqu'​à la prochaine fonction à l'aide de ''​%>​%''​. ​
 +
 +En utilisant le "​pipe",​ le code est moins redondant. De plus, il se lit et s'​écrit dans le même ordre que l'​exécution des opérations,​ ce qui facilite et accélère la traduction de nos pensées en code, ainsi que la lecture et la compréhension du code écrit par nos collègues. Lorsque nos opérations de manipulation de données deviennent plus complexes et requièrent plusieurs étapes, on s'​aperçoit rapidement que ''​magrittr''​ offre une approche puissante et élégante pour la rédaction de notre code ''​dplyr''​. ​
 +
 +**BONUS :** Dans RStudio, on peut insérer le "​pipe"​ rapidement avec la combinaison des touches suivantes: ''​Ctrl''​ (or ''​Cmd''​ sur Mac) +''​Shift''​+''​M''​.
 +
 +=====Regroupement d'​opérations et sommaires avec "​dplyr"​=====
 +
 +Les verbes ''​dplyr''​ que nous avons utilisés dans cet atelier sont utiles individuellement,​ mais deviennent particulièrement puissants quand ils sont reliés par le "​pipe"​ (''​%>​%''​),​ et lorsqu'​on les applique sur des sous-ensembles de données. Les fonctions ''​dplyr''​ suivantes nous permettent de séparer nos jeu de données en groupes distincts sur lesquels on peut exécuter des opérations individuelles,​ comme des fonctions d'​aggrégation et de sommaire:
 +
 +  * ''​group_by()'':​ regrouper le jeu de données par un facteur pour les opérations en aval (comme ''​summarise''​)
 +  * ''​summarise()'':​ créer un sommaire de variables au sein de groupes distincts dans un jeu de données en utilisant des fonctions d'​aggrégation (//e.g.// ''​min()'',​ ''​max()'',​ ''​mean()'',​ etc...)
 +
 +Ces deux verbes fournissent la structure requise pour la stratégie Séparer-Appliquer-Combiner ("​Split-Apply-Combine"​) originalement introduite dans le paquet ''​plyr'',​ l'​ancêtre de ''​dplyr''​. ​
 +
 +{{:​split-apply-combine.png?​600|}}
 +
 +Utilisons ces deux fonctions pour générer un sommaire du jeu de données ''​airquality''​ qui montre la température moyenne et l'​écart type pour chaque mois:
 +
 +<code rsplus | >
 +> mois_moy <- airquality %>​% ​
 +      group_by(Month) %>​% ​
 +      summarise(mean_temp = mean(Temp),
 +                sd_temp = sd(Temp)) ​
 +mois_moy
 +Source: local data frame [5 x 3]
 +
 +  Month mean_temp ​ sd_temp
 +  (int)     ​(dbl) ​   (dbl)
 +1     ​5 ​ 65.54839 6.854870
 +2     ​6 ​ 79.10000 6.598589
 +3     ​7 ​ 83.90323 4.315513
 +4     ​8 ​ 83.96774 6.585256
 +5     ​9 ​ 76.90000 8.355671
 +</​code>​
 +
 +----
 +
 +==== DÉFI: dplyr et magrittr =====
 +
 +//En utilisant le jeu de données ''​ChickWeight'',​ créez un tableau sommaire dans lequel on retrouve la différence de masse entre le maximum et le minimum de la masse enregistré pour chaque poussin dans l'​étude. Utilisez les verbes ''​dplyr''​ et le "​pipe"​ ''​%>​%''​.//​
 +
 +<code rsplus | >
 +?​ChickWeight
 +data(ChickWeight)
 +</​code>​
 +
 +++++Solution| ​
 +<code rsplus | >
 +> mass_diff <- ChickWeight %>​% ​
 +     ​group_by(Chick) %>​% ​
 +     ​summarise(mass_diff = max(weight) - min(weight))
 +> mass_diff
 +Source: local data frame [50 x 2]
 +
 +    Chick weight_diff
 +   ​(fctr) ​      (dbl)
 +1      18           4
 +2      16          16
 +3      15          27
 +4      13          55
 +5       ​9 ​         58
 +6      20          76
 +7      10          83
 +8       ​8 ​         92
 +9      17         100
 +10     ​19 ​        114
 +..    ...         ...
 +</​code>​
 +
 +Notez qu'ici on mesure simplement la différence de masse entre le maximum et le minimum. Il ne s'agit donc pas de la différence de masse entre le début et la fin de l'​étude (différence en ordre chronologique de la masse). Inspectez de plus près les observations liées au poussin # 18 :
 +<code rsplus | >
 +> poussin_18 <- ChickWeight %>% filter(Chick == 18)
 +> poussin_18
 +  weight Time Chick Diet
 +1     ​39 ​   0    18    1
 +2     ​35 ​   2    18    1
 +</​code>​
 +
 +On s'​aperçoit que le poussin a perdu de la masse (il est probablement décédé, puisqu'​il a seulement 2 observations). D'un point de vue scientifique,​ on pourrait s'​intéresser davantage à la question: quelle alimentation engendre un gain de masse plus important chez les poussins individuels?​ On pourrait donc calculer la différence de masse entre le début et la fin avec deux autres fonctions utiles dans ''​dplyr''​ : ''​first()''​ et ''​last()''​ nous permettent d'​accéder à la première et la deuxième observation d'un sous-groupe,​ respectivement.
 +++++
 +
 +==== Indice pour les ninjas ====
 +
 +Notez qu'on peut regrouper un jeu de données par plus qu'un facteur, en suivant la syntaxe suivante :
 +
 +''​group_by(groupe1,​ groupe2, ...)''​
 +
 +Au sein de "​group_by()",​ on peut regrouper par plusieurs variables pour créer un "​oignon"​ de sous-groupes. Chaque fois qu'on utilise la fonction ''​summarise()'',​ elle élimine une couche de l'​oignon en commençant par la couche extérieure,​ donc la dernière variable dans ''​group_by()''​ qui s'agit de ''​groupe2''​ dans cet exemple. Ainsi, dans l'​exemple ci-haut, si on utilise la fonction ''​summarise()''​ une seule fois en aval:
 +
 +''​group_by(groupe1,​ groupe2) %>% summarise(x = mean(y))''​
 +
 +Le ''​groupe2''​ est éliminé, et le jeu de données devient ensuite groupé par ''​groupe1''​. ​
 +
 +==== NINJA DÉFI: dplyr & magrittr ====
 +// En utilisant le jeu de données ''​ChickWeight'',​ créez un tableau sommaire qui indique pour chaque ''​Diet'',​ la moyenne de la différence de masse entre la fin et le début de l'​étude pour chaque poussin. Utilisez les verbes ''​dplyr''​ et le pipe ''​%>​%''​. (Indice : les fonctions ''​first()''​ et ''​last()''​ pourraient s'​avérer utiles).// ​
 +
 +++++Solution| ​
 +<code rsplus | >
 +> diet_mass <- ChickWeight %>​% ​
 +      group_by(Diet,​ Chick) %>​% ​
 +      summarise(gain_masse = last(weight) - first(weight)) %>​% ​
 +      summarise(gain_moyen = mean(gain_masse))
 +> diet_mass
 +Source: local data frame [4 x 2]
 +
 +    Diet gain_moyen
 +  (fctr) ​     (dbl)
 +1      1      114.9
 +2      2      174.0
 +3      3      229.5
 +4      4      188.3
 +</​code>​
 +Cette solution démontre bien la simplicité et l'​élégance de la syntaxe de ''​dplyr''​ et ''​magrittr''​ quand nous devons manipuler nos données en plusieurs étapes consécutives. Un défi encore plus difficile, même pour ceux qui sont experts en ''​R''​ de base, serait de reproduire les mêmes opérations avec moins de code. Nous avons essayé et nous avons échoué... Peut-être nous sommes trop habitués à ''​dplyr''​ maintenant!
 +
 +++++
 +
 +
 +===== Fusionner des tableaux de données avec dplyr =====
 +
 +En plus des fonctions que nous avons explorées aujourd'​hui,​ ''​dplyr''​ offre d'​autres fonctions forts utiles nous permettant de fusionner des tableau de données, avec une syntaxe relativement simple :
 +
 +  * ''​left_join()''​
 +  * ''​right_join()''​
 +  * ''​inner_join()''​
 +  * ''​anti_join()''​
 +
 +Ces fonctions vont au-delà du matériel d'​introduction dans cet atelier, mais ils offrent des fonctionnalités pouvant être très utiles pour des manipulations de données plus complexes.
 +
 +===== Ressources supplémentaires =====
 +
 +  * [[https://​www.rstudio.com/​wp-content/​uploads/​2015/​02/​data-wrangling-cheatsheet.pdf|L'​aide-mémoire de manipulation de données de RStudio [EN]]] ​
 +  * [[https://​juba.github.io/​tidyverse/​index.html|Introduction au tidyverse par Julien Barnier [FR]]] ​
 +  * [[https://​cran.rstudio.com/​web/​packages/​dplyr/​vignettes/​introduction.html|CRAN Intro to dplyr [EN]]]
 +  * [[http://​seananderson.ca/​2014/​09/​13/​dplyr-intro.html|Sean Anderson'​s Intro to dplyr and pipes [EN]]]
 +  * [[https://​rpubs.com/​bradleyboehmke/​data_wrangling|Bradley Boehmke'​s Intro to data wrangling [EN]]]
 +