formation r perfectionnementobjectifsetorganisation...
TRANSCRIPT
Formation R Perfectionnement
Drees ndash 16-17 avril 2018
Martin Chevalier (Insee)
1 156
Objectifs et organisation
Apprendre agrave perfectionner son utilisation de R acqueacuterir des points de repegraveres des reacuteflexes desmeacutethodes de travail
Effectuer un panorama structureacute et hieacuterarchiseacute demeacutethodes et outils largement utiliseacutes
Prendre du recul sur le logiciel comprendre certainsmodes de fonctionnement complexes
rArr Mettre en place des fondations solides pourpermettre votre progression dans lrsquoutilisation dulogiciel R
2 156
Objectifs et organisationPeacutedagogie eacutequilibre entre preacutesentations et cas pratiques(disponibles sur la page tslmcfrperf)Horaires (proposition ) 9h30-12h30 (pause vers 11h)13h45-17h00 (pause vers 15h15)
Lundi 16 avrilI Introduction + Travailler sur des donneacutees avec R 1(geacuteneacuteraliteacutes apply() etc) (2h)
I Cas pratiques (2h)I Faire des graphiques avec ggplot2 et des rapports avec R
Markdown (2h)
Mardi 17 avrilI Travailler sur des donneacutees 2 avec R (optimisations avec
base R dplyr datatable) (2h)I Cas pratiques (au choix 4h) 3 156
Introduction Se perfectionner avec R
4 156
Introduction Se perfectionner avec RConnaicirctre plus ou connaicirctre mieux
Comme tout langage statistique ou de programmation Rrepose sur un ensemble drsquoinstructions plus ou moins complexes
Se perfectionner dans la maicirctrise de R peut donc signifier deuxchoses
I eacutetendre son laquo vocabulaire raquo drsquoinstructions connues I mieux comprendre les instructions deacutejagrave connues
En pratique les deux vont de pair en deacutecouvrant denouvelles fonctions on est souvent ameneacute agrave mieux comprendrele fonctionnement de celles que lrsquoon croyait maicirctriser
5 156
Introduction Se perfectionner avec RPlan de la partie
Chercher (et trouver ) de lrsquoaideDeacutecouvrir de nouvelles fonctionnaliteacutesUtiliser de nouveaux packages
6 156
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Objectifs et organisation
Apprendre agrave perfectionner son utilisation de R acqueacuterir des points de repegraveres des reacuteflexes desmeacutethodes de travail
Effectuer un panorama structureacute et hieacuterarchiseacute demeacutethodes et outils largement utiliseacutes
Prendre du recul sur le logiciel comprendre certainsmodes de fonctionnement complexes
rArr Mettre en place des fondations solides pourpermettre votre progression dans lrsquoutilisation dulogiciel R
2 156
Objectifs et organisationPeacutedagogie eacutequilibre entre preacutesentations et cas pratiques(disponibles sur la page tslmcfrperf)Horaires (proposition ) 9h30-12h30 (pause vers 11h)13h45-17h00 (pause vers 15h15)
Lundi 16 avrilI Introduction + Travailler sur des donneacutees avec R 1(geacuteneacuteraliteacutes apply() etc) (2h)
I Cas pratiques (2h)I Faire des graphiques avec ggplot2 et des rapports avec R
Markdown (2h)
Mardi 17 avrilI Travailler sur des donneacutees 2 avec R (optimisations avec
base R dplyr datatable) (2h)I Cas pratiques (au choix 4h) 3 156
Introduction Se perfectionner avec R
4 156
Introduction Se perfectionner avec RConnaicirctre plus ou connaicirctre mieux
Comme tout langage statistique ou de programmation Rrepose sur un ensemble drsquoinstructions plus ou moins complexes
Se perfectionner dans la maicirctrise de R peut donc signifier deuxchoses
I eacutetendre son laquo vocabulaire raquo drsquoinstructions connues I mieux comprendre les instructions deacutejagrave connues
En pratique les deux vont de pair en deacutecouvrant denouvelles fonctions on est souvent ameneacute agrave mieux comprendrele fonctionnement de celles que lrsquoon croyait maicirctriser
5 156
Introduction Se perfectionner avec RPlan de la partie
Chercher (et trouver ) de lrsquoaideDeacutecouvrir de nouvelles fonctionnaliteacutesUtiliser de nouveaux packages
6 156
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Objectifs et organisationPeacutedagogie eacutequilibre entre preacutesentations et cas pratiques(disponibles sur la page tslmcfrperf)Horaires (proposition ) 9h30-12h30 (pause vers 11h)13h45-17h00 (pause vers 15h15)
Lundi 16 avrilI Introduction + Travailler sur des donneacutees avec R 1(geacuteneacuteraliteacutes apply() etc) (2h)
I Cas pratiques (2h)I Faire des graphiques avec ggplot2 et des rapports avec R
Markdown (2h)
Mardi 17 avrilI Travailler sur des donneacutees 2 avec R (optimisations avec
base R dplyr datatable) (2h)I Cas pratiques (au choix 4h) 3 156
Introduction Se perfectionner avec R
4 156
Introduction Se perfectionner avec RConnaicirctre plus ou connaicirctre mieux
Comme tout langage statistique ou de programmation Rrepose sur un ensemble drsquoinstructions plus ou moins complexes
Se perfectionner dans la maicirctrise de R peut donc signifier deuxchoses
I eacutetendre son laquo vocabulaire raquo drsquoinstructions connues I mieux comprendre les instructions deacutejagrave connues
En pratique les deux vont de pair en deacutecouvrant denouvelles fonctions on est souvent ameneacute agrave mieux comprendrele fonctionnement de celles que lrsquoon croyait maicirctriser
5 156
Introduction Se perfectionner avec RPlan de la partie
Chercher (et trouver ) de lrsquoaideDeacutecouvrir de nouvelles fonctionnaliteacutesUtiliser de nouveaux packages
6 156
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Introduction Se perfectionner avec R
4 156
Introduction Se perfectionner avec RConnaicirctre plus ou connaicirctre mieux
Comme tout langage statistique ou de programmation Rrepose sur un ensemble drsquoinstructions plus ou moins complexes
Se perfectionner dans la maicirctrise de R peut donc signifier deuxchoses
I eacutetendre son laquo vocabulaire raquo drsquoinstructions connues I mieux comprendre les instructions deacutejagrave connues
En pratique les deux vont de pair en deacutecouvrant denouvelles fonctions on est souvent ameneacute agrave mieux comprendrele fonctionnement de celles que lrsquoon croyait maicirctriser
5 156
Introduction Se perfectionner avec RPlan de la partie
Chercher (et trouver ) de lrsquoaideDeacutecouvrir de nouvelles fonctionnaliteacutesUtiliser de nouveaux packages
6 156
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Introduction Se perfectionner avec RConnaicirctre plus ou connaicirctre mieux
Comme tout langage statistique ou de programmation Rrepose sur un ensemble drsquoinstructions plus ou moins complexes
Se perfectionner dans la maicirctrise de R peut donc signifier deuxchoses
I eacutetendre son laquo vocabulaire raquo drsquoinstructions connues I mieux comprendre les instructions deacutejagrave connues
En pratique les deux vont de pair en deacutecouvrant denouvelles fonctions on est souvent ameneacute agrave mieux comprendrele fonctionnement de celles que lrsquoon croyait maicirctriser
5 156
Introduction Se perfectionner avec RPlan de la partie
Chercher (et trouver ) de lrsquoaideDeacutecouvrir de nouvelles fonctionnaliteacutesUtiliser de nouveaux packages
6 156
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Introduction Se perfectionner avec RPlan de la partie
Chercher (et trouver ) de lrsquoaideDeacutecouvrir de nouvelles fonctionnaliteacutesUtiliser de nouveaux packages
6 156
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Chercher (et trouver ) de lrsquoaideSavoir utiliser lrsquoaide du logicielAgrave tout moment taper help(nomFonction) ou nomFonction affiche lrsquoaide de la fonction nomFonction
Aide de la fonction readcsv readcsv
Remarque Pour afficher lrsquoaide sur une fonction drsquoun packageil faut que celui-ci soit au preacutealable chargeacute (avec library() ourequire())La fonction helpsearch() ou la commande permettentdrsquoeffectuer une recherche approximative
Recherche agrave partir du mot-cleacute csv csv
7 156
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Chercher (et trouver ) de lrsquoaideChercher de lrsquoaide en ligneBien souvent le problegraveme que lrsquoon rencontre a deacutejagrave eacuteteacuterencontreacute par drsquoautres
Pour progresser dans la maicirctrise de R il ne faut donc surtoutpas heacutesiter agrave srsquoappuyer sur les forums de discussion comme parexemple stackoverflow
On gagne ainsi souvent beaucoup de temps en formulant leproblegraveme que lrsquoon rencontre dans un moteur de recherchepour consulter certaines reacuteponses
Quand une question semble ne pas avoir eacuteteacute deacutejagrave poseacutee ne pasheacutesiter agrave la poser soi-mecircme en joignant alors un exemplereproductible (minimal working example ou MWE)
8 156
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Chercher (et trouver ) de lrsquoaideAfficher le code drsquoune fonctionQuand lrsquoutilisation drsquoune fonction pose problegraveme (messagedrsquoerreur inattendu) il est souvent utile drsquoafficher son codepour comprendre drsquoougrave vient le problegravemePour ce faire il suffit de saisir son nom sans parenthegravese
Code de la fonction readcsvreadcsv
function (file header = TRUE sep = quote = dec = fill = TRUE commentchar = ) readtable(file = file header = header sep = sep quote = quote dec = dec fill = fill commentchar = commentchar ) ltbytecode 0x8883a98gt ltenvironment namespaceutilsgt
Afficher le code drsquoune fonction est dans certains cas plusdifficile cf stackoverflow
9 156
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Deacutecouvrir de nouvelles fonctionnaliteacutesSe repeacuterer dans les CRAN Task ViewsLes CRAN Task Views recensent les fonctions et packages defaccedilon theacutematique Elles sont mises agrave jour reacuteguliegraverement etportent sur des thegravemes varieacutes Bayesian ChemPhys ClinicalTrials Cluster DifferentialEquationsDistributions Econometrics Environmetrics ExperimentalDesignExtremeValue Finance FunctionalData Genetics GraphicsHighPerformanceComputing MachineLearning MedicalImagingMetaAnalysis ModelDeployment MultivariateNaturalLanguageProcessing NumericalMathematics OfficialStatisticsOptimization Pharmacokinetics Phylogenetics PsychometricsReproducibleResearch Robust SocialSciences Spatial SpatioTemporalSurvival TimeSeries WebTechnologies gR
La liste de toutes les Task Views est accessible agrave la page httpscranr-projectorgwebviews
10 156
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Deacutecouvrir de nouvelles fonctionnaliteacutesConsulter des sites tutoriels livresDe plus en plus de supports sont consacreacutes agrave la preacutesentation etagrave lrsquoenseignement des fonctionnaliteacutes de R comme par exemple
I le site R-bloggers articles en geacuteneacuteral courts sur desexemples drsquoapplications (de qualiteacute ineacutegale)
I le site bookdownorg deacutepocirct de livres numeacuteriquesconsacreacutes agrave R eacutelaboreacutes avec R Markdown (tregraves riches ettregraves complets)
I le site de RStudio nombreux aides-meacutemoires ou articlespreacutesentant les fonctionnaliteacutes de lrsquoeacutecosystegraveme RStudio
I les ouvrages de Hadley Wickham ggplot2 elegant graphics for data analysis (agrave compilersoi-mecircme) Advanced R
11 156
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Utiliser de nouveaux packagesAcceacuteder agrave la documentation drsquoun packageUne des principales forces de R est drsquoecirctre un langage hautementmodulaire comptant plusieurs milliers de packages (12 416au 10042018)Toutes les informations sur un package sont accessibles sur sapage du Comprehensive R Archive Network (CRAN)Exemple httpsCRANR-projectorgpackage=haven
On trouve en particulier sur cette page
I les deacutependances du package (Depends et Imports) I un lien vers sa page de deacuteveloppement (URL) I une version pdf de son aide (Reference manual)I eacuteventuellement un ou plusieurs documents dedeacutemonstration (Vignettes)
12 156
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Utiliser de nouveaux packagesInstaller un package automatiquement
La fonction installpackages(nomPackage) permetdrsquoinstaller automatiquement le package nomPackageLes donneacutees neacutecessaires sont teacuteleacutechargeacutees depuis un des deacutepocirctsdu CRAN (repositories ou en abreacutegeacute repos)Crsquoest la meacutethode agrave privileacutegier les deacutependances neacutecessairesau bon fonctionnement du package sont deacutetecteacutees etautomatiquement installeacutees
13 156
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Utiliser de nouveaux packagesInstaller un package manuellementLa page drsquoinformation drsquoun package comporte eacutegalement desliens vers les fichiers qui le composentQuand lrsquoinstallation directe depuis un deacutepocirct du CRAN estindisponible il suffit de teacuteleacutecharger ces fichiers et drsquoinstallermanuellement le packagePour une installation sous Windows il faut privileacutegier lesfichiers compileacutes (Windows binaries)
Note Le fichier haven_110zip est situeacute dans le reacutepertoire de travailinstallpackages(
haven_110zip repos = NULL type = binaries)
14 156
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Utiliser de nouveaux packagesInstaller des packages depuis githubEn regravegle geacuteneacuterale le deacuteveloppement de packages srsquoappuie surdes plate-formes de deacuteveloppement collaboratif commeGithubLa page de deacuteveloppement drsquoun package comporte plusieursinformations preacuteciseuses
I la derniegravere version du package et de sa documentation I des informations sur son deacuteveloppement I une zone pour rapporter drsquoeacuteventuels bugs (bug reports)
Exemple httpsgithubcomtidyversehavenLa fonction install_github() du package devtools permetdrsquoinstaller un package directement depuis GitHub
library(devtools)install_github(tidyversehaven)
15 156
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Utiliser de nouveaux packagesUtiliser les donneacutees drsquoexemples drsquoun packageLa plupart des packages contiennent des donneacuteesdrsquoexemples utiliseacutees notamment dans son aide ou sesvignettesUne fois le package installeacute il suffit drsquoutiliser la fonctiondata(package = nomPackage) pour afficher les donneacuteesqursquoil contient
library(ggplot2)data(package = ggplot2)
Pour laquo rapatrier raquo dans lrsquoenvironnement global les donneacutees drsquounpackage crsquoest de nouveau la fonction data() qursquoil faut utiliser
data(mpg)
16 156
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Travailler efficacement sur des don-neacutees avec R
17 156
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Travailler efficacement sur des donneacutees avec RQursquoest-ce que travailler efficacement avec R Appliqueacute au travail sur des donneacutees lrsquoefficaciteacute peut avoir aumoins deux significations distinctes
I efficaciteacute algorithmique minimisation du temps passeacutepar la machine pour reacutealiser une seacuterie drsquoopeacuterations
I productiviteacute du programmeur minimisation du tempspasseacute agrave coder une seacuterie drsquoopeacuteration
En regravegle geacuteneacuterale on peut avoir lrsquoideacutee que plus on souhaite ecirctreefficace algorithmiquement plus la programmation risque drsquoecirctrelongue et difficileCe nrsquoest pas toujours vrai on perd souvent beaucoup detemps agrave (reacute)inventer une meacutethode peu efficace quand unebeaucoup plus simple et rapide existe deacutejagraveReacutefeacuterence Gillepsie C Lovelace R Efficient Rprogramming (disponible sur bookdownorg) 18 156
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Travailler efficacement sur des donneacutees avec RMesure lrsquoefficaciteacute algorithmiqueLa fonction systemtime() permet de mesurer la dureacutee drsquountraitementsystemtime(rnorm(1e6))
utilisateur systegraveme eacutecouleacute 0072 0000 0072
Neacuteanmoins elle est inadapteacutee aux traitements de tregraves courtedureacutee Dans ces situations privileacutegier la fonctionmicrobenchmark() du package microbenchmarklibrary(microbenchmark)microbenchmark(times = 10 rnorm(1e6))
Unit milliseconds expr min lq mean median rnorm(1e+06) 6816277 6884521 690792 68892 uq max neval 6905627 7045888 10
19 156
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Travailler efficacement sur des donneacutees avec RMesurer la taille drsquoun objet en meacutemoire
R stocke lrsquoensemble des fichiers sur lesquels il travaille dans lameacutemoire viveAfin de loger les objets les plus gros mais aussi drsquooptimiser lesperformances il est souvent utile de limiter la taille desobjets sur lesquels portent les traitementsPour mesurer la taille des objets utiliser la fonctionobject_size() du package pryr
library(pryr)object_size(rnorm(1e6))
8 MB
20 156
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Travailler efficacement sur des donneacutees avec RConstruire un exemple reproductible (MWE)Lorsque lrsquoon cherche agrave ameacuteliorer les performances drsquounprogramme il est important de pouvoir le tester sur desdonneacutees autonomes et reproductiblesPour ce faire les fonctions de geacuteneacuterations de nombresaleacuteatoires de R sont particuliegraverement utiles Graine pour pouvoir reproduire laleacuteasetseed(2018)
Vecteur de nombres de taille 1 000a lt- rnorm(1000)
Vecteur de lettres de taille 1 000b lt- letters[sample(126 1000 replace = TRUE)]
Matrice logique 1 000 x 100 avec 1 de TRUEc lt- matrix(runif(100000) gt 099 ncol = 100)
21 156
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
Travailler efficacement sur des donneacutees avec RPlan de la partie
De lrsquoimportance des fonctions dans RVectoriser apply() Reduce() et docall()
Coder efficacement en base Rdplyr une grammaire du traitement des donneacuteesdatatable un dataframe optimiseacuteAller plus loin avec R
22 156
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
De lrsquoimportance des fonctions dans Rlaquo Tout ce qui agit est un appel de fonction raquo
To understand computations in R two slogans arehelpful
I Everything that exists is an objectI Everything that happens is a function call
John Chambers
mecircme assigner une valeurisfunction(`lt-`)
[1] TRUE`lt-`(a 10)
mecircme afficher la valeur dun objeta
[1] 10print(a)
[1] 1023 156
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
De lrsquoimportance des fonctions dans RDeacutefinir une fonction dans RUtiliseacute avec lt- function() deacutefinit une nouvelle fonction Deacutefinition de la fonction monCalcul()monCalcul lt- function(a b)
resultat lt- 10 a + breturn(resultat)
Code de monCalcul()monCalcul
function(a b) resultat lt- 10 a + b return(resultat)
Appel de la fonction monCalcul()monCalcul(2 3)
[1] 2324 156
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-
De lrsquoimportance des fonctions dans RValeurs par deacutefaut des paramegravetresDes valeurs par deacutefaut peuvent ecirctre renseigneacutees pour lesparamegravetres
monCalcul lt- function(a b = 3) 10 a + bmonCalcul(8)
[1] 83
Les valeurs par deacutefaut peuvent deacutependre des autres paramegravetres
monCalcul lt- function(a b = a 2) 10 a + bmonCalcul(2)
[1] 24
Remarque Ceci est la conseacutequence de la lazy evaluation desarguments dans R (cf Advanced R)
25 156
De lrsquoimportance des fonctions dans RControcircle de la valeur des paramegravetresDes structures conditionnelles if() permettent de controcircler lavaleur des arguments
monCalcul lt- function(a = NULL b = NULL)if(isnull(a)) stop(a nest pas renseigneacute)if(isnull(b))
b lt- a 2warning(b nest pas renseigneacute)
return(10 a + b)
monCalcul(b = 3) Error in monCalcul(b = 3) a nest pas renseigneacute
monCalcul(a = 1) Warning in monCalcul(a = 1) b nest pas renseigneacute [1] 12
26 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (1)Dans R chaque objet est repeacutereacute par son nom et sonenvironnement cela permet drsquoeacuteviter les conflits de noms
Creacuteation dune fonction sum() un peu absurdesum lt- function() Ma super somme sum(2 3)
[1] Ma super somme
Cette fonction est rattacheacutee agrave lenvironnement globalls()
[1] a b c monCalcul [5] sum
Mais on peut toujours acceacuteder agrave la fonction de base en utilisant basesum(2 3)
[1] 5
27 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (2)Agrave chaque appel drsquoune fonction un environnement drsquoexeacutecutionest creacuteeacute
maFun lt- function() environment()maFun()
ltenvironment 0xb82b160gtmaFun()
ltenvironment 0xb667210gt
En conseacutequence les instructions exeacutecuteacutees agrave lrsquointeacuterieur drsquounefonction ne modifient pas lrsquoenvironnement globala lt- 10maFonction3 lt- function()
a lt- 5maFonction3()a
[1] 10 28 156
De lrsquoimportance des fonctions dans RPorteacutee des variables et environnements (3)
En revanche les objets deacutefinis dans lrsquoenvironnement global sontaccessibles au sein drsquoune fonction
a lt- 10maFonction4 lt- function()
a + 5maFonction4()
[1] 15
Ceci est ducirc au fait que les environnements dans lequel Rrecherche des objets sont emboicircteacutes les uns dans les autres(cf la fonction search())Pour en savoir plus Advanced R obeautifulcodecom
29 156
De lrsquoimportance des fonctions dans RValeur de retour drsquoune fonctionLa fonction return() speacutecifie la valeur agrave renvoyer Pourrenvoyer plusieurs valeurs utiliser une listemaFonction1 lt- function()
a lt- 15 b lt- 610 return(a)maFonction1()
[1] 1 2 3 4 5
maFonction2 lt- function()a lt- 15 b lt- 610 return(list(a = a b = b))
maFonction2()
$a [1] 1 2 3 4 5 $b [1] 6 7 8 9 10
30 156
De lrsquoimportance des fonctions dans REffets de bord et programmation fonctionnelle
Par deacutefaut les fonctions dans R
I ne modifient pas lrsquoenvironnement drsquoorigine (il nrsquoy a pasdrsquoeffets de bord)
I peuvent ecirctre utiliseacutees en lieu et place des valeurs qursquoellesretournent
monCalcul lt- function(a b) 10 a + bmonCalcul(2 3) + 5
[1] 28
Ces eacuteleacutements font de R un langage particuliegraverement adapteacuteagrave la programmation fonctionnelle
31 156
De lrsquoimportance des fonctions dans RQuelques principes de la programmationfonctionnelle1 Ne jamais creacuteer drsquoeffets de bord Toute modification
apporteacutee agrave lrsquoenvironnement par une fonction passe par savaleur de sortie
2 Vectoriser ie appliquer des fonctionssysteacutematiquement agrave un ensemble drsquoeacuteleacutementsFonctions apply() Reduce() docall()
3 Structurer les traitements agrave lrsquoaide de fonctionscourtes et explicites Faciliter la relecture lamaintenance et la modularisation
Pour en savoir plus Wikipedia maryrosecookcom32 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment apply()La fonction apply(X MARGIN FUN) applique la fonctionFUN agrave la matrice X selon la dimension MARGIN
Deacutefinition et affichage de la matrice mm lt- matrix(16 ncol = 3)m
[1] [2] [3] [1] 1 3 5 [2] 2 4 6
Application de la fonction sum() selon les lignesapply(m 1 sum)
[1] 9 12
Application de la fonction sum() selon les colonnesapply(m 2 sum)
[1] 3 7 11
33 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment lapply()La fonction lapply(X FUN) applique la fonction FUN au vecteurou agrave la liste X
l lt- list(15 c(69 NA))l
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
lapply(l sum) [[1]] [1] 15 [[2]] [1] NA
Exemple drsquoutilisation Appliquer une fonction agrave toutes les variablesdrsquoune table 34 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque indeacutependamment sapply()La fonction sapply() est analogue agrave la fonction lapply()mais simplifie le reacutesultat produit quand crsquoest possible
sapply(l sum) [1] 15 NA
Les arguments optionnels de la fonction utiliseacutee peuvent ecirctreajouteacutes agrave la suite dans toutes les fonctions apply()
sapply(l sum narm = TRUE) [1] 15 30
Exemple drsquoutilisation Calcul de statistiques sur toutes lesvariables drsquoune table
35 156
Vectoriser apply() Reduce() et docall()Deacutefinir une fonction agrave la voleacutee dans apply()Il est freacutequent que lrsquoopeacuteration que lrsquoon souhaite appliquer necorresponde pas exactement agrave une fonction preacute-existanteDans ce cas on peut deacutefinir une fonction agrave la voleacutee dans lafonction apply() On souhaite seacutelectionner le second eacuteleacutement de de chaque vecteur de la liste ll
[[1]] [1] 1 2 3 4 5 [[2]] [1] 6 7 8 9 NA
On deacutefinit une fonction dans sapply()sapply(l function(x) x[2])
[1] 2 736 156
Vectoriser apply() Reduce() et docall()Appliquer sur chaque par groupe tapply()La fonction tapply(X INDEX FUN) applique la fonctionFUN agrave lrsquoobjet X ventileacute selon les modaliteacutes de INDEX Variables dacircge et de sexeage lt- c(45 50 35 20)sexe lt- c(H F F H)
Acircge moyen par sexetapply(age sexe mean)
F H 425 325
Mecircme reacutesultat avec une combinaison de sapply() et de split()sapply(split(age sexe) mean)
F H 425 325
Exemple drsquoutilisation Calcul de statistiques agreacutegeacutees parcateacutegories 37 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous docall()La fonction docall(what args) permet drsquoappliquer lafonction what() agrave un ensemble drsquoarguments args speacutecifieacutecomme une liste (alors que les fonctions apply()appliqueraient what() agrave chaque eacuteleacutement de args)
Concateacutenation des vecteurs de ldocall(basec l)
[1] 1 2 3 4 5 6 7 8 9 NA
Equivalent agravebasec(l[[1]] l[[2]])
[1] 1 2 3 4 5 6 7 8 9 NA
Exemple drsquoutilisation Concateacutener de nombreuses tables avecrbind() ou cbind()
38 156
Vectoriser apply() Reduce() et docall()Appliquer sur tous successivement Reduce()
La fonction Reduce(f x) permet drsquoappliquer la fonction f()successivement agrave lrsquoensemble des eacuteleacutements de x (alors quedocall() applique f simultaneacutement)
Application successive de la division au vecteur 14Reduce(`` 14)
[1] 004166667
Equivalent agrave((12)3)4
[1] 004166667
Exemple drsquoutilisation Fusionner de nombreuses tables avecmerge() (sur les mecircmes identifiants)
39 156
Coder efficacement en base RLrsquoideacutee En faire faire le moins possible agrave RR est un langage dit laquo de haut niveau raquo les objets qui lecomposent sont relativement faciles drsquoutilisation au prix deperformances limiteacutees
Agrave lrsquoinverse des langages dits de laquo bas niveau raquo (par exempleC++) sont plus difficiles agrave utiliser mais aussi plus efficaces
La plupart des fonctions fondamentales de R font appel agrave desfonctions compileacutees agrave partir drsquoun langage de plus bas niveau
Drsquoougrave le principe limiter au maximum la surcharge lieacutee agraveR pour retomber au plus vite sur des fonctions preacute-compileacutees
Remarque Il est tregraves facile en pratique drsquoutiliser R comme uneinterface vers des langages de plus bas niveau cf infra agrave proposde Rcpp
40 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (1)Comme la plupart des langages de programmation R dispose destructures de controcircles permettant de reacutealiser des bouclesboucle lt- function(x)
cumul lt- rep(NA length(x))for(i in seq_along(x))
cumul[i] lt- if(i == 1) x[i] else cumul[i - 1] + x[i]return(cumul)
boucle(15)
[1] 1 3 6 10 15
Ces opeacuterations preacutesentent plusieurs inconveacutenients
1 Elles sont longues agrave eacutecrire et assez peu claires 2 Elles reposent sur des effets de bord 3 Elles sont en geacuteneacuteral tregraves peu efficaces
algorithmiquement 41 156
Coder efficacement en base RUtiliser les boucles avec parcimonie (2)Les meacutethodes de vectorisation sont en geacuteneacuteral beaucoup plusefficaces que les boucles en R
I vectorisation de haut niveau (cf supra) I vectorisation de bas niveau la vectorisation est opeacutereacutee par le
langage de bas niveau auquel fait appel R
summary(microbenchmark(times = 10L boucle = boucle(11e4) Reduce = Reduce(`+` 11e4 accumulate = TRUE) cumsum = cumsum(11e4)
))[ 14] expr min lq mean 1 boucle 15751411 16676220 173426323 2 Reduce 5828524 5945065 66623951 3 cumsum 37019 39746 472646
42 156
Coder efficacement en base RTirer le meilleur parti de la compilation (1)On distingue souvent deux familles de langages informatiques
I les langages compileacutes (C C++) lrsquoensemble du code esttransformeacute en langage machine par un compilateur puissoumis par le systegraveme drsquoexploitation
I les langages interpreacuteteacutes (R Python) les instructions ducode sont soumises les unes apregraves les autres par uninterpreacuteteur ce qui est moins efficace (cf boucles en R)
La fonction compilercmpfun() permet neacuteanmoins decompiler des fonctions R avant utilisation Compilation de la fonction boucle()boucle_compil lt- compilercmpfun(boucle)microbenchmark(boucle(11e4) boucle_compil(11e4))
Unit milliseconds expr min lq mean boucle(110000) 15805389 17005351 17874497 boucle_compil(110000) 1588799 1722751 1750571 median uq max neval 17697739 18263382 21722003 100 1738325 1765799 2212019 100
43 156
Coder efficacement en base RTirer le meilleur parti de la compilation (2)Une autre fonctionnaliteacute du package compiler est lacompilation laquo juste-agrave-temps raquo (ou just-in-time JIT) le codenrsquoest plus interpreacuteteacute mais compileacute au fur et agrave mesure
Dans R on active le mode JIT pour une session gracircce agrave lafonction compilerenableJIT() en speacutecifiant leniveau de compilation JIT (de 0 agrave 3) Passage au niveau maximal de compilation JITcompilerenableJIT(3)
[1] 0summary(microbenchmark(boucle(11e4) boucle_compil(11e4)))[ 14]
expr min lq mean 1 boucle(110000) 1582040 1603213 1729375 2 boucle_compil(110000) 1585057 1609157 1657959
Remarque Depuis R 340 enableJIT() vaut 3 par deacutefaut44 156
Coder efficacement en base RUtiliser lrsquoopeacuterateur [ au lieu de ifelse()Lorsqursquoon creacutee une variable en faisant intervenir une condition il estfreacutequent drsquoutiliser la fonction ifelse()
notes lt- runif(n = 100000 min = 0 max = 20)mavar lt- ifelse(notes gt= 10 Reccedilu Recaleacute)
Il est neacuteanmoins beaucoup plus efficace drsquoutiliser lrsquoopeacuterateur [
microbenchmark(times = 10L ifelse = ifelse(notes gt= 10 Reccedilu Recaleacute) [ =
mavar lt- rep(Recaleacute length(notes))mavar[notes gt= 10] lt- Reccedilu
)
Unit milliseconds expr min lq mean median ifelse 2625032 26321084 2671476 26460366 [ 139027 1431458 151165 1470771 uq max neval 26714720 28400851 10 1567792 1750101 10
45 156
Coder efficacement en base RSimplifier les donneacutees le type factorOn utilise souvent des chaicircnes de caractegravere pour coder unevariable de nature cateacutegorielleLe type factor permet de remplacer chaque valeur distinctepar un entier en sauvegardant la table de correspondance Il estbeaucoup plus leacuteger Variable agrave deux modaliteacutes codeacutees en caractegraveressexe lt- sample(c(H F) 120000 replace = TRUE)object_size(sexe)
960 kB
Conversion en facteurfsexe lt- factor(sexe)str(fsexe)
Factor w 2 levels FH 1 2 1 2 1 2 2 2 1 1 object_size(fsexe)
481 kB46 156
Coder efficacement en base RUtiliser les noms agrave bon escient (1)La plupart des objets manipuleacutes couramment dans R peuventecirctre nommeacutes vecteurs matrices listes dataframeUtiliser des noms est une meacutethode souvent tregraves rapide pouracceacuteder aux eacuteleacutements qui composent ces objets
Exemple On cherche agrave extraire les observations drsquoune table vialeur identifiant id On compare lrsquoutilisation des noms agrave unefusion reacutealiseacutee avec merge()
Creacuteation de la table dfid lt- ascharacter(sample(1e5))sexe lt- sample(12 1e5 replace = TRUE)df lt- dataframe(id sexe)
47 156
Coder efficacement en base RUtiliser les noms agrave bon escient (2) Affectation de noms agrave dfrownames(df) lt- id
Liste des identifiants agrave extraireextract lt- c(234 12 7890)
Comparaisonmicrobenchmark(times = 10L
merge = merge(dataframe(id = extract) df sort = FALSE) names = df[extract ]
) Unit milliseconds expr min lq mean median merge 14794181 15264378 1540527 15437613 names 2611688 2655904 281817 2736901 uq max neval 15636058 15901694 10 3019022 3074043 10
48 156
Coder efficacement en base RAgrave propos des matrices (1)Quand crsquoest possible travailler sur des matrices (plutocirct quedes dataframe) est souvent source drsquoefficaciteacute
I de nombreuses opeacuterations sont vectoriseacutees pour lesmatrices sommes en lignes et en colonnes (rowSums() etcolSums()) etc
I lrsquoalgegravebre matricielle (le produit matriciel notamment)est tregraves bien optimiseacutee
I selon la nature du problegraveme lrsquoutilisation de matriceslacunaires (sparse) peut faire gagner et en empreintemeacutemoire et en temps de calcul (cf le package Matrix)
49 156
Coder efficacement en base RAgrave propos des matrices (2) Creacuteation dune matrice m avec 99 de 0v lt- rep(0 1e6) v[sample(1e6 1e4)] lt- rnorm(1e4)m lt- matrix(v ncol = 100)
Transformation en matrice lacunairelibrary(Matrix)M lt- Matrix(m)
Gain en espace (en ko)c(object_size(m) object_size(M))
[1] 8000200 121824
Gain de performances pour la fonction colSums()microbenchmark(dense = colSums(m) sparse = colSums(M))
Unit microseconds expr min lq mean median dense 1260470 1281146 131386973 13101305 sparse 56086 70537 8259214 832135 uq max neval 13338945 1444225 100 923815 148062 100
50 156
dplyr une grammaire du traitement des donneacuteesPhilosophie de dplyrdplyr est un package deacuteveloppeacute par RStudio et en particulierpar Hadley Wickham Il constitue un veacuteritable eacutecosystegravemevisant agrave faciliter le travail sur des tables statistiques
I il fournit un ensemble de fonctions eacuteleacutementaires (leslaquo verbes raquo) pour effectuer les manipulations de donneacutees
I plusieurs verbes peuvent facilement ecirctre combineacutes enutilisant lrsquoopeacuterateur gt (pipe)
I toutes les opeacuterations sont optimiseacutees par du code de basniveau
library(dplyr)
Pour en savoir plus De nombreuses vignettes tregravespeacutedagogiques sont disponibles sur la page du package Unaide-meacutemoire est eacutegalement disponible sur le site de RStudio
51 156
dplyr une grammaire du traitement des donneacuteesDonneacutees drsquoexemple table flights denycflights13Les exemples relatifs aux packages dplyr et datatablesrsquoappuient sur les donneacutees du package nycflights13
library(nycflights13)
Ce package contient des donneacutees sur tous les vols au deacutepart dela ville de New-York en 2013
data(package = nycflights13)dim(flights)
[1] 336776 19names(flights)[19]
[1] year month day [4] dep_time sched_dep_time dep_delay [7] arr_time sched_arr_time arr_delay
52 156
dplyr une grammaire du traitement des donneacuteesSimplifier des opeacuterations de base Rdplyr propose plusieurs verbes pour simplifier certainesopeacuterations parfois fastidieuses en base R - filter() seacutelectionne des observations selon une ou plusieursconditions filter(flights month == 7 day == 4)
- arrange() trie le fichier selon une ou plusieurs variables arrange(flights month desc(distance))
- select() seacutelectionne des variables par leur noms select(flights yeararr_delay)
- rename() renomme des variablesrename(flights annee = year)
53 156
dplyr une grammaire du traitement des donneacuteesCalculer des statistiques avec summarise()La fonction summarise() permet de facilement calculer desstatistiques sur des donneacutees
summarise(flights distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)
distance_moyenne retard_max 1 1039913 1272
Remarque Comme toutes les fonctions de dplyrsummarise() prend un dataframe en entreacutee et produit undataframe en sortie
54 156
dplyr une grammaire du traitement des donneacuteesVentiler des traitements avec group_by()Appliqueacute au preacutealable agrave un dataframe group_by() ventiletous les traitements ulteacuterieurs selon les modaliteacutes drsquoune ouplusieurs variables
flights_bymonth lt- group_by(flights month)summarise(flights_bymonth
distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)[13 ]
month distance_moyenne retard_max 1 1 1006844 1272 2 2 1000982 834 3 3 1011987 915
55 156
dplyr une grammaire du traitement des donneacuteesEnchaicircner des opeacuterations avec gtLrsquoutilisation des verbes de dplyr ne prend tout son inteacuterecirct quequand ils sont enchaicircneacutes en utilisant lrsquoopeacuterateur pipe gtmaTable gt maFonction(param1 param2) est eacutequivalentagrave maFonction(maTable param1 param2)Ainsi lrsquoenchaicircnement de nombreuses opeacuterations devientbeaucoup plus facile agrave mettre en œuvre et agrave comprendre
flights gtgroup_by(year month day) gtsummarise(
retard_arrivee = mean(arr_delay narm = TRUE)retard_depart = mean(dep_delay narm = TRUE)
) gtfilter(retard_arrivee gt 30 | retard_depart gt 30)
56 156
dplyr une grammaire du traitement des donneacuteesFusionner des tables avec _join()dplyr dispose de nombreuses fonctions tregraves utiles pourfusionner une ou plusieurs tables ensemble qui srsquoinspirenttregraves fortement de SQL
I a gt left_join(b by = id) fusionne a et b enconservant toutes les observations de a
I a gt right_join(b by = id) fusionne a et b enconservant toutes les observations de b
I a gt inner_join(b by = id) fusionne a et b enne conservant que les observations dans a et b
I a gt full_join(b by = id) fusionne a et b enconservant toutes les observations
Pour en savoir plus Une vignette est consacreacutee agrave lapreacutesentation des fonctions de dplyr portant sur deux tables
57 156
dplyr une grammaire du traitement des donneacuteesComparaison de base R et de dplyrdplyr est particuliegraverement inteacuteressant pour travailler sur desdonneacutees par groupe On compare donc lrsquoutilisation detapply() de base R avec group_by() de dplyrdf lt- dataframe(
x = rnorm(1e6) by = sample(1e3 1e6 replace = TRUE)
)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x))
) Unit milliseconds expr min lq mean median uq base 3633509 4280433 4241404 4329193 4416897 dplyr 5333831 5345452 5614469 5514207 5600287 max neval 4550056 10 6504266 10
58 156
datatable un dataframe optimiseacutePhilosophie de datatableContrairement agrave dplyr datatable ne cherche pas agrave sesubstituer agrave base R mais agrave le compleacuteterIl introduit un nouveau type drsquoobjet le datatable qui heacuteritedu dataframe (tout datatable est un dataframe)Appliqueacute agrave un datatable lrsquoopeacuterateur [ est enrichi etoptimiseacute
library(datatable)flights_DT lt- datatable(flights)
Pour en savoir plus Lagrave encore des vignettes tregravespeacutedagogiques sont disponibles sur la page du package
59 156
datatable un dataframe optimiseacuteLrsquoopeacuterateur [ du datatable i j et byLa syntaxe de lrsquoopeacuterateur [ appliqueacute agrave un datatable est lasuivante (DT repreacutesente le datatable)
DT[i j by]I i seacutelectionner des observations selon une condition I j seacutelectionner ou creacuteer une ou plusieurs variables I by ventiler les traitements selon les modaliteacutes drsquoune ou
plusieurs variables
Exemple Retard quotidien maximal au mois de janvier
flights_DT[month == 1 max(arr_delay narm = TRUE) by = day
]
60 156
datatable un dataframe optimiseacuteSeacutelectionner des observations avec iIl est beaucoup plus simple et efficace de seacutelectionner desobservations dans un datatable que dans un dataframe
I il nrsquoy a pas agrave reacutepeacuteter le nom du dataframe dans [
I il est possible drsquoindexer un datatable par une ou plusieurslaquo cleacutes raquo permettant une recherche souvent plus rapide
setkey(flights_DT origin)microbenchmark(times = 100L
base = flights[flights$origin == JFK] dt1 = flights_DT[origin == JFK] dt2 = flights_DT[list(JFK)]
) Unit milliseconds expr min lq mean median uq base 4171417 4365880 5429650 4923702 5010314 dt1 1080914 1126147 1290479 1145061 1197763 dt2 1046219 1081319 1399015 1103693 1168497 max neval 21869998 100 2121712 100 17924473 100
61 156
datatable un dataframe optimiseacuteCalculer des statistiques avec jLrsquoargument j permet de calculer des statistiques agreacutegeacutees
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)] distance_moyenne retard_max 1 1039913 1272
Utiliseacute avec = il permet de les refusionner automatiquementavec les donneacutees drsquoorigine
flights_DT lt- flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
)]62 156
datatable un dataframe optimiseacuteVentiler des traitements avec by et keybyLrsquoargument by de [ ventile tous les traitements renseigneacutes dansj selon les modaliteacutes drsquoune ou plusieurs variables
flights_DT[ j = list(distance_moyenne = mean(distance) retard_max = max(arr_delay narm = TRUE)
) by = month][13] month distance_moyenne retard_max 1 1 1006844 1272 2 10 1038876 688 3 11 1050305 796
Remarque Par deacutefaut by ordonne les reacutesultats dans lrsquoordredes groupes dans le datatable keyby trie les donneacutees selonla variable drsquoagreacutegation (comme group_by de dplyr)
63 156
datatable un dataframe optimiseacuteChaicircner les opeacuterations dans un datatableIl est tregraves facile de chaicircner les opeacuterations sur un datatableen enchaicircnant les [
flights_DT[ j = list(
retard_arrivee = mean(arr_delay narm = TRUE) retard_depart = mean(dep_delay narm = TRUE)
) keyby = list(year month day)
][retard_arrivee gt 30 | retard_depart gt 30]
Remarque Ces chaicircnages sont possibles avec un datatablemais pas avec un dataframe
64 156
datatable un dataframe optimiseacuteComparaison de base R dplyr etdatatable Conversion de la table de test en datatabledt lt- datatable(df)
microbenchmark(times = 10L base = tapply(df$x df$by sum) dplyr = df gt group_by(by) gt summarise(sum(x)) datatable = dt[ sum(x) keyby = by]
) expr lq mean uq 1 base 3732276 4205503 4562500 2 dplyr 5390310 5507001 5611389 3 datatable 2057499 2156300 2091101
Pour en savoir plus Cette discussion sur stackoverflowcom(notamment entre les auteurs des packages) aborde lesavantages et les inconveacutenients de dplyr et datatable
65 156
datatable un dataframe optimiseacuteParenthegravese lire et eacutecrire rapidement desfichiers plats avec datatableLe package datatable fournit par ailleurs deux fonctionsextrecircmement utiles en pratique pour lire et eacutecrire des fichiersplats (csv txt dlm)
I fread() beaucoup plus rapide et plus ergonomique quereadtable() et ses alias (readcsv()readdelim()) produit directement un datatable
I fwrite() beaucoup plus rapide que writetable()
Lecture avec fread()mon_fichier lt- fread(file = mon_fichiercsv sep = )
Ecriture avec fwrite()fwrite(mon_fichier file = mon_fichiertxt sep = t)
66 156
Aller plus loin avec RLes limites du logicielLes outils preacutesenteacutes jusqursquoagrave preacutesent correspondent agrave uneutilisation laquo classique raquo de R production drsquoune enquecircteredressements eacutetudes
Il arrive neacuteanmoins que certains traitements soient rendusdifficiles par les caracteacuteristiques du logiciel
I travail sur des volumes de donneacutees impossibles agrave loger enmeacutemoire
I temps de calcul trop longs et impossibles agrave reacuteduire
Dans ce genre de situations la solution consiste en geacuteneacuteral agraveutiliser R comme une interface vers des techniques oulangages susceptibles de reacutepondre au problegraveme poseacute
67 156
Aller plus loin avec RSe connecter agrave des bases de donneacuteesUne autre solution pour exploiter de grands volumes de donneacuteesdans R est de lrsquoutiliser pour interroger des bases dedonneacutees via par exemple le package RPostgreSQLlibrary(RPostgreSQL)
Connexion agrave la base de donneacutees maBdddrv lt- dbDriver(PostgreSQL)con lt- dbConnect(drv dbname = maBdd
host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabledbGetQuery(con SELECT COUNT() FROM maTable)
Remarque Diffeacuterents packages permettent de se connecter agravediffeacuterents types de base de donneacutees RMySQl pour MySQL etc
68 156
Aller plus loin avec RSe connecter agrave des bases de donneacutees avec dplyrdplyr a la particulariteacute de pouvoir fonctionner de faccedilontotalement transparente sur des bases de donneacutees de diffeacuterentstypes
library(dplyr)
Connexion agrave la base de donneacutees maBddcon lt- src_postgres(
dbname = maBdd host = localhost port = 5432 user = utilisateur password = motDePasse
)
Requecircte SQL sur la table maTabletbl(con SELECT COUNT() FROM maTable)
ou utilisation des verbes de dplyrtbl(con) gt summarise(n())
69 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (1)
La plupart des ordinateurs possegravedent aujourdrsquohui plusieurscœurs (core) susceptibles de mener des traitements enparallegravele (8 sur chaque serveur drsquoAUS par exemple)Par deacutefaut R nrsquoexpoite qursquoun seul cœur le package parallel(mais aussi les packages snow ou foreach par exemple)permettent de paralleacuteliser des structures du type applyCe type drsquoopeacuterations est composeacute de plusieurs eacutetapes
1 Creacuteation et parameacutetrage du laquo cluster raquo de cœurs agrave utiliser(chargement des fonctions et packages neacutecessaires surchaque cœur)
2 Lancement du traitement paralleacuteliseacute avec parLapply() 3 Arrecirct des processus du cluster avec stopCluster()
70 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (2)Dans cet exemple on cherche agrave appliquer la fonction f agravechaque matrice de la liste llibrary(MASS)f lt- function(x) rowSums(ginv(x))l lt- lapply(1100 function(x) matrix(runif(1e4) ncol = 1e2))
Creacuteation et parameacutetrage du clusterlibrary(parallel)cl lt- makeCluster(4)clusterEvalQ(cl library(MASS))clusterExport(cl f)
Lancement du calcul paralleacuteliseacuteparLapply(cl l f)
Arrecirct des processus du clusterstopCluster(cl)
71 156
Aller plus loin avec RParalleacuteliser des traitements avec parallel (3)
microbenchmark(times = 10 lapply(l f) parLapply(cl l f)
) Unit milliseconds expr min lq mean lapply(l f) 6406186 6412107 6455821 parLapply(cl l f) 3360838 3836429 4001393 median uq max neval 6418607 6516407 6591777 10 4038412 4245455 4319449 10
72 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (1)Le package Rcpp permet drsquointeacutegrer facilement des fonctionscodeacutees en C++ dans un programme R
library(Rcpp)cppFunction(int add(int x int y)
int result = x + yreturn result
)
add(1 2) [1] 3
Remarque Il est eacutegalement possible de soumettre un fichiercontenant des fonctions C++ eacutecrit par ailleurs agrave lrsquoaide de lafonction sourceCpp()Pour en savoir plus Advanced R
73 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (2)Contrairement agrave R C++ est un langage de bas niveau lesboucles y sont en particulier extrecircmement rapidesExemple Somme cumuleacutee par colonne Fonction C++cppFunction(NumericMatrix cumColSumsC(NumericMatrix x)
int nrow = xnrow() ncol = xncol()NumericMatrix out(nrow ncol)for (int j = 0 j lt ncol j++)
double acc = 0for(int i = 0 i lt nrow i++)
acc += x(i j)out(i j) = acc
return out
)74 156
Aller plus loin avec RRcpp un package R pour utiliser C++ (3) Fonction RcumColSumsR lt- function(x)
apply(x 2 cumsum)
Les deux fonctions produisent les mecircmes reacutesultatsx lt- matrix(rnorm(1e6) ncol = 1e2)allequal(cumColSumsR(x) cumColSumsC(x))
[1] TRUE
mais cumColSumsC() est beaucoup plus rapide summary(microbenchmark(times = 10
cumColSumsR(x) cumColSumsC(x)
))[ c(expr lq mean uq)] expr lq mean uq 1 cumColSumsR(x) 19506836 38770332 25321596 2 cumColSumsC(x) 4416819 5062526 5752609
75 156
Reacutealiser des graphiques avec R
76 156
Reacutealiser des graphiques avec RR et la reacutealisation de graphiquesLa reacutealisation de graphiques dans un logiciel statistique est uneopeacuteration souvent longue et complexeDans la plupart des cas lrsquoajustement fin des paramegravetres par lebiais de lignes de code relegraveve de la gageureR dispose neacuteanmoins de plusieurs caracteacuteristiques qui facilitentla reacutealisation de graphiques
I souplesse la tregraves grande varieacuteteacute des types drsquoobjetssimplifie les parameacutetrages
I rigueur la dimension fonctionnelle du langage aide agravesysteacutematiser lrsquoutilisation des paramegravetres graphiques
I adaptabiliteacute la liberteacute de deacuteveloppement de modulescompleacutementaires rend possible de profondes innovationsdans la conception des graphiques
77 156
Reacutealiser des graphiques avec RBase R ou ggplot2 Il existe aujourdrsquohui troix principaux paradigmes pour produiredes graphiques avec R
I les fonctionnaliteacutes de base du logiciel du packagegraphics
I les fonctionnaliteacutes plus eacutelaboreacutees des packages grid etlattice (non-abordeacutees dans cette formation)
I la laquo grammaire des graphiques raquo du package ggplot2
Plan de la partie
Reacutealiser des graphiques avec graphics
Reacutealiser des graphiques avec ggplot278 156
Reacutealiser des graphiques avec RDonneacutees drsquoexemple table mpg de ggplot2La plupart des exemples de cette partie sont produits agrave partir de latable mpg du package ggplot2
library(ggplot2)dim(mpg)
[1] 234 11names(mpg)
[1] manufacturer model displ [4] year cyl trans [7] drv cty hwy [10] fl class
I displ cylindreacutee I drv transmission (f traction r propulsion 4 quatre roues
motrices) I cty et hwy nombre de miles parcourus par gallon drsquoessence
en ville et sur autoroute respectivement79 156
Reacutealiser des graphiques avec graphicsBeaucoup de fonctions des paramegravetres communsLa creacuteation de graphiques avec le package de base graphicssrsquoappuie sur la fonction plot() ainsi que sur des fonctionsspeacutecifiques
I plot(hist(x)) plot(density(x)) histogrammes etdensiteacutes
I plot(ts) repreacutesentation de seacuteries chronologiques I plot(x y) nuages de points I barplot(table(x)) et pie(table(x)) diagrammes
en bacirctons et circulaires
Si ce nrsquoest quelques arguments speacutecifiques ces fonctionspartagent un ensemble de paramegravetres graphiquescommunsPour en savoir plus Le site statmethodsnet recense etillustre la plupart des fonctions du package graphics
80 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesLes fonctions histogram() et density() calculent lesstatistiques ensuite utiliseacutees par la fonction plot() pourconstruire les graphiquesArguments speacutecifiques agrave hist()
I breaks meacutethode pour deacuteterminer les limites des classes I labels = TRUE ajoute lrsquoeffectif de chaque classe
Arguments speacutecifiques agrave density() I bw largeur de la fenecirctre utiliseacutee par la fonction de lissage I kernel fonction de lissage utiliseacutee
Remarque Lrsquoargument plot de la fonction hist() (TRUE pardeacutefaut) affiche automatiquement un graphique sans avoir agraveappeler explicitement la fonction plot()
81 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacuteshist(mpg$hwy breaks = seq(10 44 by = 2)
col = lightblue labels = TRUE)
Histogram of mpg$hwy
mpg$hwy
Fre
quen
cy
10 15 20 25 30 35 40 45
010
2030
40
5
2
17
41
24
9
20
47
21
26
11
34
10
12
82 156
Reacutealiser des graphiques avec graphicsHistogrammes et densiteacutesplot(density(mpg$hwy bw = 05 kernel = gaussian))
10 15 20 25 30 35 40 45
000
002
004
006
008
010
012
densitydefault(x = mpg$hwy bw = 05 kernel = gaussian)
N = 234 Bandwidth = 05
Den
sity
83 156
Reacutealiser des graphiques avec graphicsSeacuteries chronologiques avec plot(ts)class(AirPassengers)
[1] tsplot(AirPassengers)
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
84 156
Reacutealiser des graphiques avec graphicsNuages de points avec plot(x y)plot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
85 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesLa fonction table() permet de calculer les statistiques utiliseacuteesensuite par barplot() et pie() pour construire les graphiquesArguments speacutecifiques agrave barplot()
I horiz construit le graphique horizontalement I namesarg nom agrave afficher pregraves des barres
Arguments speacutecifiques agrave pie() I labels noms agrave afficher agrave cocircteacute des portions de disque I clockwise sens dans lequel sont repreacutesenteacutees les
modaliteacutes I initangle point de deacutepart en degreacutes
Remarque Quand barplot() est appliqueacute agrave un tri croiseacute lacouleur des barres varie et les paramegravetres deviennent utiles
I beside position des barres I legendtext ajoute une leacutegende avec le texte indiqueacute
86 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesuni lt- table(mpg$drv)lab lt- c(4 roues Traction Propulsion)barplot(uni namesarg = lab)
4 roues Traction Propulsion
020
4060
8010
0
87 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairespie(uni labels = paste0(lab n uni)
initangle = 90 clockwise = TRUE)
4 roues103
Traction106
Propulsion25
88 156
Reacutealiser des graphiques avec graphicsDiagrammes en bacirctons et circulairesbi lt- table(mpg$drv mpg$year)barplot(bi horiz = TRUE beside = TRUE legendtext = lab)
1999
2008
PropulsionTraction4 roues
0 10 20 30 40 50
89 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsPlusieurs paramegravetres permettent de modifier la couleur laforme ou la taille des eacuteleacutements qui composent un graphique
I pch entier ou caractegravere speacutecial indiquant la forme despoints agrave repreacutesenter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
I col valeur indiquant la couleur du contour des formesutiliseacutees Peut ecirctre un entier (recycleacute au-delagrave de 8) unnom ou un code RGB hexadeacutecimal (du type FF1111)
1 2 3 4 5 6 7 8
Pour certaines formes (pch entre 21 et 25) il est eacutegalementpossible de modifier la couleur de remplissage avec bg
90 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsRemarque la palette de couleurs accessibles en utilisant desentiers est reacuteduite Il est possible de lrsquoeacutetendre consideacuterablementvia la fonction colors()
colors()[13] [1] white aliceblue antiquewhite
length(colors()) [1] 657
grep(blue colors() value = TRUE)[13] [1] aliceblue blue blue1
- cex utiliseacute dans une fonction plot() cex permet drsquoajusterla taille des points qui le composent1 2 3 4 5 6
91 156
Reacutealiser des graphiques avec graphicsCouleur forme et taille des objetsLa fonction legend() permet drsquoajouter une leacutegendet lt- factor(mpg$drv
labels = c(4 roues Traction Propulsion))plot(mpg$displ mpg$hwy pch = 21 col = t bg = t)legend(topright legend = unique(t) pch = 21
col = unique(t) ptbg = unique(t))
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Traction4 rouesPropulsion
92 156
Reacutealiser des graphiques avec graphicsTitres texte et axesLes titres sont parameacutetreacutes agrave lrsquoaide des fonctions suivantes
I main pour ajouter le titre principal I xlab et ylab pour ajouter des titres aux axes
La fonction text() permet drsquoajouter du texte sur le graphiqueen le positionnant par ses coordonneacutees eacuteventuellement avec undeacutecalage (pour nommer des points par exemple) Il esteacutegalement possible de parameacutetrer les axes
I xlim et ylim speacutecifient les valeurs minimales etmaximales de chaque axe
I axis() est une fonction qui permet drsquoajouter un axepersonnaliseacute
Remarque Pour produire un graphique sans axe et les rajouterapregraves utiliser lrsquooption axes = FALSE de la fonction plot()
93 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesPar deacutefaut lrsquoutilisation de la fonction plot() produit unnouveau graphiquePour superposer diffeacuterents graphiques le plus simple est decommencer par une instruction plot() puis de la compleacuteter
I avec points() pour ajouter des points I avec lines() pour ajouter des lignes I avec abline() pour ajouter des lignes drsquoapregraves une
eacutequation I avec curve() pour ajouter des courbes drsquoapregraves une
eacutequation
Exemple Ajout drsquoune droite de reacutegression au graphique de hwypar displ
94 156
Reacutealiser des graphiques avec graphicsCombinaison de plusieurs graphiquesreg lt- lm(hwy ~ displ data = mpg)plot(mpg$displ mpg$hwy)abline(a = reg$coefficients[1] b = reg$coefficients[2])
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
95 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (1)Utiliseacutee en dehors de la fonction plot() la fonction par()permet de deacutefinir lrsquoensemble des paramegravetres graphiques globauxSes mots-cleacutes les plus importants sont
I mfrow permet de disposer plusieurs graphiquescocircte-agrave-cocirctepar(mfrow = c(1 2)) 1 ligne et 2 colonnespar(mfrow = c(3 2)) 3 lignes et 2 colonnespar(mfrow = c(1 1)) 1 ligne et 1 colonne
I cex coefficient multiplicatif pour modifier la taille delrsquoensemble des textes et symboles utiliseacutes dans lesgraphiques (1 par deacutefaut)
Pour en savoir plus La page drsquoaide de la fonction par()deacutetaille toutes ces options
96 156
Reacutealiser des graphiques avec graphicsParamegravetres geacuteneacuteraux et disposition (2)
par(mfrow = c(1 2))plot(mpg$displ mpg$hwy)plot(AirPassengers)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
Time
AirP
asse
nger
s
1950 1952 1954 1956 1958 1960
100
200
300
400
500
600
97 156
Reacutealiser des graphiques avec graphicsExportationPour exporter des graphiques depuis R la deacutemarche consiste agraverediriger le flux de production du graphique vers un fichier agravelrsquoaide drsquoune fonction du package grDevices Par exemple
png(monGraphiquepng width = 10 height = 8 unit = cm res = 600)
plot(mpg$displ mpg$hwy)devoff()
Dans ce contexte les fonctions les plus utiles sont png()jpeg() et pdf() En particulier pdf() permet de conserver lecaractegravere vectoriel des graphiques produits par RRemarque Les graphiques peuvent eacutegalement facilement ecirctreexporteacutes depuis RStudio en utilisant les menus preacutevus agrave ceteffet
98 156
Reacutealiser des graphiques avec ggplot2Lrsquoimpleacutementation drsquoune grammaire des graphiquesLe package graphics permet de reacutealiser une grande quantiteacutede graphiques mais preacutesente deux limites importantes
I les fonctions qui le composent forment une casuistiquecomplexe
I il nrsquoest pas possible drsquoinventer de nouvelles repreacutesentationsagrave partir des fonctions existantes
Ce sont ces limites que tente de deacutepasser le package ggplot2en impleacutementant une grammaire des graphiquesComme les eacuteleacutements du langage les composantseacuteleacutementaires drsquoun graphique doivent pouvoir ecirctrereacuteassembleacutes pour produire de nouvelles repreacutesentationsPour aller plus loin Wilkinson L (2005) The Grammar ofGraphics Springer ggplot2 elegant graphics for data analysis
99 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphiqueLa construction drsquoun graphique avec ggplot2 fait intervenirtrois composants essentiels (drsquoapregraves Wickham ibid 23)
I le dataframe dans lequel sont stockeacutees les donneacutees agraverepreacutesenter
I des correspondances estheacutetiques (aesthetic mappings)entre des variables et des proprieacuteteacutes visuelles
I au moins une couche (layer) deacutecrivant commentrepreacutesenter les observations
Exemple Miles per gallon sur lrsquoautoroute en fonction de lacylindreacutee
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
100 156
Reacutealiser des graphiques avec ggplot2Les trois composants essentiels drsquoun graphique
ggplot(data = mpg mapping = aes(x = displ y = hwy)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
101 156
Reacutealiser des graphiques avec ggplot2Rappel le mecircme graphique avec base Rplot(mpg$displ mpg$hwy)
2 3 4 5 6 7
1520
2530
3540
45
mpg$displ
mpg
$hw
y
102 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
103 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = cyl shape = drv)) +
geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
4
5
6
7
8cyl
drv
4
f
r
104 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
105 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = drv)) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
drv
4
f
r
106 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
107 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsggplot(mpg aes(displ hwy colour = asfactor(cyl)
shape = asfactor(cyl))) +geom_point()
20
30
40
2 3 4 5 6 7
displ
hwy
asfactor(cyl)
4
5
6
8
108 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objetsPour faire varier lrsquoaspect visuel des eacuteleacutements repreacutesenteacutes enfonction de donneacutees il suffit drsquoassocier une variable agravelrsquoattribut de couleur de taille ou de forme dans lafonction aes()Selon le type des variables utiliseacutees pour les correspondancesestheacutetiques les eacutechelles sont continues ou discregravetesQuand la mecircme variable est utiliseacutee dans plusieurscorrespondances estheacutetiques les eacutechelles qui luicorrespondent sont fusionneacuteesAu-delagrave des correspondances estheacutetiques dans la fonctionaes() lrsquoaspect visuel peut ecirctre ajusteacute directement dansla fonction geom_
109 156
Reacutealiser des graphiques avec ggplot2Couleur forme et taille des objets
ggplot(mpg aes(displ hwy)) +geom_point(colour = red size = 8 alpha = 05)
20
30
40
2 3 4 5 6 7
displ
hwy
110 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth() `geom_smooth()` using method = loess
20
30
40
2 3 4 5 6 7
displ
hwy
111 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiques
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
112 156
Reacutealiser des graphiques avec ggplot2Combinaison de plusieurs graphiquesggplot(mpg aes(displ hwy colour = drv)) +
geom_point() + geom_smooth(method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
113 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2La construction drsquoun graphique dans ggplot2 repose sur lasuperposition de couches (layer) conccedilues indeacutependammentmais reacuteconcilieacutees en fin drsquoopeacuterationChaque couche est composeacutee de cinq eacuteleacutements
I un dataframe (data) I une ou plusieurs correspondances estheacutetiques (mapping) I une transformation statistique (stat) I un objet geacuteomeacutetrique (geom) I un paramegravetre drsquoajustement de la position (position)
Crsquoest la fonction layer() qui articule ces cinq eacuteleacutementsLes fonctions geom_ vues preacuteceacutedemment sont desappels preacute-parameacutetreacutees de layer()
114 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Un graphique agrave une coucheggplot() + layer(
data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
)
20
30
40
2 3 4 5 6 7
displ
hwy
115 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
ggplot() + layer(data = mpg mapping = aes(displ hwy) stat = identity geom = point position = identity
) + layer(data = mpg mapping = aes(displ hwy) stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
116 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
Un graphique agrave deux couches
10
20
30
40
2 3 4 5 6 7
displ
hwy
117 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Mise en facteur dans ggplot() de data et mapping
ggplot(data = mpg mapping = aes(displ hwy)) + layer(stat = identity geom = point position = identity
) + layer(stat = smooth geom = line position = identity params = list(method = lm formula = y ~ x)
)
Remplacement de layer() par des alias preacute-parameacutetreacutes
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE)
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point() + stat_smooth(method = lm se = FALSE)
118 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2Agrave chaque fonction geom_() est assoceacutee un paramegravetre statpar deacutefaut et agrave chaque fonction stat_() un geom par deacutefaut
ggplot(data = mpg mapping = aes(displ hwy)) +geom_point(colour = red aes(size = cyl)) +stat_smooth(geom = point method = lm se = FALSE
colour = blue shape = 2)
10
20
30
40
2 3 4 5 6 7
displ
hwy
cyl
4
5
6
7
8
119 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(colour = drv)) +stat_smooth(method = lm se = FALSE)
10
20
30
40
2 3 4 5 6 7
displ
hwy
drv
4
f
r
120 156
Reacutealiser des graphiques avec ggplot2Le fonctionnement en laquo couches raquo de ggplot2
ggplot(mpg aes(displ hwy)) +geom_point(aes(shape = drv) colour = red) +stat_smooth(aes(colour = class) method = lm se = FALSE)
20
30
40
2 3 4 5 6 7
displ
hwy
class
2seater
compact
midsize
minivan
pickup
subcompact
suv
drv
4
f
r
121 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy)) + geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
Remarque Le positionnement des classes des histogrammes sembleperturbeacute dans les derniegraveres versions de ggplot2 le paramegravetreboundary permet de corriger ce problegraveme (cf cette discussion)
122 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_histogram()
0
10
20
30
40
10 20 30 40
hwy
coun
t
drv
4
f
r
123 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutes
ggplot(mpg aes(hwy)) + geom_density(bw = 05)
0000
0025
0050
0075
0100
0125
20 30 40
hwy
dens
ity
124 156
Reacutealiser des graphiques avec ggplot2Histogrammes et densiteacutesggplot(mpg aes(hwy colour = drv fill = drv)) +
geom_density(bw = 05 alpha = 05)
000
005
010
015
020
20 30 40
hwy
dens
ity
drv
4
f
r
125 156
Reacutealiser des graphiques avec ggplot2Seacuteries temporelles
ggplot(economics aes(date unemploy pop)) +geom_line()
002
003
004
005
1970 1980 1990 2000 2010
date
unem
ploy
pop
126 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv colour = drv fill = drv)) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t
drv
4
f
r
127 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaireslibrary(scales)ggplot(mpg aes(drv fill = drv)) +
geom_bar(aes(y = (count)sum(count))) +scale_y_continuous(labels=percent) +scale_fill_brewer(palette=Blues)
0
10
20
30
40
4 f r
drv
(c
ount
)s
um(
cou
nt)
drv
4
f
r
128 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulaires
g lt- ggplot(mpg aes(x = fill = drv colour = drv)) +geom_bar(width = 1)
g
0
50
100
150
200
x
coun
t
drv
4
f
r
129 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesg + coord_polar(theta = y) + theme_minimal() +
scale_fill_grey() + scale_colour_grey()
0
50
100
150
200
count
x
drv
4
f
r
Pour aller plus loin Une page du site sthdacom explique (enfranccedilais) comment produire un diagramme circulaire complet avecggplot2 130 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar()
0
25
50
75
100
4 f r
drv
coun
t asfactor(year)
1999
2008
131 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(drv fill = asfactor(year))) +
geom_bar(position = fill)
000
025
050
075
100
4 f r
drv
coun
t asfactor(year)
1999
2008
132 156
Reacutealiser des graphiques avec ggplot2Diagrammes en bacirctons et circulairesggplot(mpg aes(asfactor(year) fill = drv)) +
geom_bar(position = dodge) +coord_flip()
1999
2008
0 20 40
count
asfa
ctor
(yea
r) drv
4
f
r
133 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_boxplot(coef = 15)
20
30
40
4 f r
drv
hwy
134 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_jitter()
10
20
30
40
4 f r
drv
hwy
135 156
Reacutealiser des graphiques avec ggplot2Boicirctes agrave moustaches et assimileacutesggplot(mpg aes(x = drv y = hwy)) +
geom_violin()
20
30
40
4 f r
drv
hwy
136 156
Reacutealiser des graphiques avec ggplot2Titres et axesggplot(mpg aes(displ hwy)) + geom_point() +
ggtitle(Mon titre avec un retour nagrave la ligne) +xlab(Cylindreacutee) + ylab(Miles per gallon) +coord_cartesian(xlim = c(010) ylim = c(0 100))
0
25
50
75
100
00 25 50 75 100
Cylindreacutee
Mile
s pe
r ga
llon
Mon titre avec un retour agrave la ligne
137 156
Reacutealiser des graphiques avec ggplot2Disposition le facettingggplot(mpg aes(displ hwy)) +
geom_point() + geom_smooth(method = lm se = FALSE) +facet_wrap(~manufacturer nrow = 3)
nissan pontiac subaru toyota volkswagen
hyundai jeep land rover lincoln mercury
audi chevrolet dodge ford honda
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
10
20
30
40
10
20
30
40
10
20
30
40
displ
hwy
138 156
Reacutealiser des graphiques avec ggplot2Disposition le facetting
ggplot(mpg aes(displ hwy)) +geom_point() + geom_smooth(method = lm se = FALSE) +facet_grid(drv~class)
2seater compact midsize minivan pickup subcompact suv
4f
r
2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7 2 3 4 5 6 7
20
30
40
20
30
40
20
30
40
displ
hwy
139 156
Reacutealiser des graphiques avec ggplot2Sauvegarde et exportationLe reacutesultat de la fonction ggplot() pouvant ecirctre stockeacute dansun objet R il est possible de le sauvegarder tel quel avecsave() ou saveRDS() et de le reacuteutiliser par la suite dans R
g lt- ggplot(mpg aes(displ hwy)) + geom_point()saveRDS(g file = grds)
La fonction ggsave() simplifie lrsquoexport de graphiques en dehorsde R Par deacutefaut elle sauvegarde le dernier graphique produit
g + geom_smooth(method = lm se = FALSE)ggsave(monGraphiquepdf)ggsave(monGraphiquepng)
140 156
Geacuteneacuterer automatiquement desdocuments depuis R
141 156
Geacuteneacuterer automatiquement des documents depuis RPourquoi geacuteneacuterer automatiquement des documents
I Exporter et documenter des traitements en vue drsquounereacuteutilisation future statistiques pour une eacutetudetraitements reacutealiseacutes lors drsquoune reacuteunion de travail etcRemarque Utilisation analogue agrave celle permise par lesinstructions ODS RTF ou ODS PDF de SAS
I Construire des rapports complets et automatiseacutes pourdes tacircches reacutepeacutetitives rapports drsquoutilisation tests de lacoheacuterence ou de la qualiteacute de nouvelles donneacutees etc
I Produire des publications reproductibles sur diffeacuterentssupports notes documentation articles de revues etc
142 156
Geacuteneacuterer automatiquement des documents depuis RPrincipe de la geacuteneacuteration automatique de documentsLa geacuteneacuteration automatique de documents complets repose surdeux eacuteleacutements
1 Articuler le code les reacutesultats et le commentaire dans unmecircme document garantir la coheacuterence et faciliter lesmises agrave jour
2 Formater de faccedilon standardiseacutee le document versplusieurs sorties html pdf docx odt
Code RTableauxgraphiques Commentaire
pdf html docx odt
143 156
Geacuteneacuterer automatiquement des documents depuis REtapes de la geacuteneacuteration automatique de documents
R Markdown v2 (Rmd)
Code RTableauxgraphiques Commentaire
knitr
pandoc
docx odthtml pdf
LaTeX
mdtex
Note rmarkdown et knitr sont des packages R (avec plusieursdeacutependances) pandoc et LaTeX sont des programmes autonomes
144 156
Geacuteneacuterer automatiquement des documents depuis RPreacuteparer et tester lrsquoenvironnement de travail1 Travailler sous RStudio
I RStudio facilite lrsquoeacutedition et la compilation de fichier Rmd I pandoc est embarqueacute par deacutefaut dans RStudio
2 Installer les packages neacutecessairesI installer le package rmarkdown et ses deacutependances I installer le package knitr et ses deacutependances
3 Pour produire des fichiers pdf installer LaTeX (MiKTeXsous Windows) et srsquoassurer que ses programmes figurentdans le path de Windows
4 Creacuteer un nouveau fichier R Markdown (Rmd) installer lespackages compleacutementaires demandeacutes choisir le type dedocument et compiler le fichier drsquoexemple (Ctrl + K)
145 156
Geacuteneacuterer automatiquement des documents depuis REcrire du texte dans R MarkdownPour eacutecrire du texte dans un document R Markdown il suffit dele taper dans le fichier Rmd (sans le commenter nilrsquoeacutechapper drsquoaucune maniegravere)Des balises speacuteciales permettent de mettre en forme ledocument
I les signes et _ permettent de mettre des mots enitalique ou en gras
I les six niveaux de titres sont preacutefixeacutes par les signes (premier niveau) (deuxiegraveme niveau) etc
I des listes sont automatiquement creacuteeacutees agrave partir desuccessions de - ou de seacutequences de nombres ou de lettresseacutepareacutees par un retour agrave la ligne
Note Pour une preacutesentation syntheacutetique de R Markdown sereacutefeacuterer agrave lrsquoaide-meacutemoire (cheat sheet) sur le site de RStudio
146 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes blocs de code R sont inteacutegreacutes dans R Markdown de la faccedilonsuivante
```r2 + 2```
Par deacutefaut le code est eacutevalueacute et lui-mecircme ainsi que sesreacutesultats sont afficheacutes dans le document en sortie
2 + 2
[1] 4
147 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R MarkdownLes options saisies en deacutebut de bloc permettent de preacuteciser agraveknitr la maniegravere de le prendre en compte par exemple
I eval=FALSE le bloc nrsquoest pas eacutevalueacute I echo=FALSE le bloc nrsquoest pas afficheacute I collapse=TRUE code et reacutesultats sont afficheacutes agrave la suite
```r echo=FALSE2 + 2```
[1] 4
Note Toutes les options de knitr relatives aux blocs de code(chunk options) sont preacutesenteacutees sur la page du creacuteateur dupackage Yihui Xie
148 156
Geacuteneacuterer automatiquement des documents depuis REcrire du code dans R Markdown
Il est eacutegalement possible drsquointeacutegrer le reacutesultat drsquoun traitement Rdans le corps drsquoun paragraphe avec la syntaxe
`r `
Exemple Pour inteacutegrer dans le texte la date de compilation dudocument utiliser
Document compileacute le `r SysDate()`
Document compileacute le 2018-04-10
149 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R MarkdownTous les graphiques produits par les blocs de code sontautomatiquement inteacutegreacutes au fichier finalUn grand nombre drsquooptions sont consacreacutees au parameacutetragedes graphiques notamment
I figwidth figheight largeur et hauteur utiliseacuteespour produire le graphique en pouces
I figasp rapport hauteurlargeur (figheight estneutraliseacute quand figasp est renseigneacute)
I outwidth outheight largeur et hauteur dugraphique dans la sortie finale
I figalign alignement du grahique (left rightou center)
I dpi (72 par deacutefaut) reacutesolution (utile uniquement pourHTML)
150 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown
```r figasp = 34 figwidth = 4plot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
151 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des graphiques dans R Markdown```r figasp = 34 figwidth = 6 outwidth = 4inplot(mpg$displ mpg$hwy)```
2 3 4 5 6 7
1525
3545
mpg$displ
mpg
$hw
y
152 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownPour construire un tableau dans R Markdown il suffit de lelaquo dessiner raquo avec les signes - et |
Colonne 1 | Colonne 2 | Colonne 3-------- | -------- | -------1 | a | `TRUE`2 | b | `FALSE`
Colonne 1 Colonne 2 Colonne 31 a TRUE2 b FALSE
Les permettent de speacutecifier lrsquoalignement des colonnes153 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R MarkdownEn regravegle geacuteneacuterale cependant les tableaux agrave inteacutegrer sontgeacuteneacutereacutes automatiquement agrave partir des donneacutees
```rresultat lt- datatable(mpg)[
list(hwy=mean(hwy) cty=mean(cty)) by = drv]resultat```
drv hwy cty 1 f 2816038 199717 2 4 1917476 143301 3 r 2100000 140800
La fonction knitrkable() permet de transformer unobjet R en tableau formateacute pour R Markdown
154 156
Geacuteneacuterer automatiquement des documents depuis RInteacutegrer des tableaux dans R Markdown```r results = asisknitrkable(resultat)```|drv | hwy| cty||---|--------|-------||f | 2816038| 199717||4 | 1917476| 143301||r | 2100000| 140800|
Ce qui donne une fois formateacute par R Markdown
drv hwy cty
f 2816038 1997174 1917476 143301r 2100000 140800
155 156
Geacuteneacuterer automatiquement des documents depuis RParameacutetrer un document R MarkdownLa plupart des paramegravetres geacuteneacuteraux du documents sont agraveindiquer dans son en-tecircte (deacutesigneacute par lrsquoacronyme YAML)
---title Formation R Perfectionnementauthor Martin Chevalier (Insee)output
html_documenthighlight haddocktoc yestoc_depth 2toc_float yes
---
Pour en savoir plus Le site de RStudio documente leparameacutetrage de lrsquoen-tecircte YAML selon les formats de sortiesouhaiteacutes (html pdf)
156 156
- Objectifs et organisation
- Introduction Se perfectionner avec R
-
- Chercher (et trouver ) de laide
- Deacutecouvrir de nouvelles fonctionnaliteacutes
- Utiliser de nouveaux
-
- Travailler efficacement sur des donneacutees avec R
-
- De limportance des fonctions dans R
- Vectoriser apply() Reduce() et docall()
- Coder efficacement en base R
- dplyr une grammaire du traitement des donneacutees
- datatable un dataframe optimiseacute
- Aller plus loin avec R
-
- Reacutealiser des graphiques avec R
-
- Reacutealiser des graphiques avec graphics
- Reacutealiser des graphiques avec
-
- Geacuteneacuterer automatiquement des documents depuis R
-