156
Formation R Perfectionnement Drees – 16-17 avril 2018 Martin Chevalier (Insee) 1 / 156

Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 2: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 3: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 4: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 5: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 6: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 7: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 8: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 9: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 10: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 11: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 12: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 13: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 14: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 15: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 16: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 17: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 18: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 19: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 20: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 21: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 22: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 23: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 24: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 25: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h

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
Page 26: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 27: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 28: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 29: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 30: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 31: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 32: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 33: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 34: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 35: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 36: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 37: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 38: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 39: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 40: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 41: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 42: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 43: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 44: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 45: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 46: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 47: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 48: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 49: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 50: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 51: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 52: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 53: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 54: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 55: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 56: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 57: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 58: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 59: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 60: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 61: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 62: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 63: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 64: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 65: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 66: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 67: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 68: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 69: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 70: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 71: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 72: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 73: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 74: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 75: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 76: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 77: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 78: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 79: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 80: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 81: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 82: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 83: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 84: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 85: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 86: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 87: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 88: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 89: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 90: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 91: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 92: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 93: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 94: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 95: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 96: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 97: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 98: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 99: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 100: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 101: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 102: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 103: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 104: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 105: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 106: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 107: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 108: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 109: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 110: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 111: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 112: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 113: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 114: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 115: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 116: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 117: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 118: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 119: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 120: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 121: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 122: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 123: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 124: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 125: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 126: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 127: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 128: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 129: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 130: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 131: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 132: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 133: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 134: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 135: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 136: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 137: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 138: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 139: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 140: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 141: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 142: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 143: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 144: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 145: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 146: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 147: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 148: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 149: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 150: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 151: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 152: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 153: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 154: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 155: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h
Page 156: Formation R PerfectionnementObjectifsetorganisation Pédagogie:équilibreentreprésentationsetcaspratiques (disponiblessurlapaget.slmc.fr/perf). Horaires(proposition!):9h30-12h30(pausevers11h