Tutorat R: Junior entreprise ENSAE
Objectif de la formation
C’est quoi R?
R est un langage orienté vers le traitement de données et l’analyse statistique dérivé du langage S. Il est développé depuis une vingtaine d’années par un groupe de volontaires de différents pays.
- R est à la fois un logiciel et un langage de programmation.
- R comporte de nombreux fonctionalités pour l’analyse statistique, la
- représentation graphique et la production de rapports automatisés (word, pdf, html, beamer, etc.).
- R est un logiciel libre;
- les fonctionalités des bases peuvent être étendue à l’aide d’extentions appelées packages.
- Une forte communauté autour.
L’environnement de R et les commandes de base
L’objectif de cette setion est de présenter l’environnement Rstudio et présenter quelques commandes de base du langage R.
R est avant tout une calculatrice.
R est avant tout une calculatrice car il permet à l’utilisateur d’effectuer des calculs simples.
# somme
1+2## [1] 3
# difference
4-2## [1] 2
# produit
7*2## [1] 14
# division
14/2## [1] 7
# Combinaison d'opération
14/2 +2 -10*4## [1] -31
On peut stocker le résultat pour une utilisation future:
# <- est l'opérateur d'assignation.
x<-8+2
x+15## [1] 25
Types de données R
logique (logical)
Ce sont des données de type booléans: Vrai et Faux.
x<-TRUE
x## [1] TRUE
y<-1>2
y## [1] FALSE
la fonction classe permet de connaitre le type d’un objet.
class(y)## [1] "logical"
Numérique (numeric)
Ce sont des données de type numérique.
x<-1
x## [1] 1
y<-pi
y## [1] 3.141593
class(y)## [1] "numeric"
Chaine ou texte (character)
Ce sont des données de type chaine de caractere
x<-"Formation R"
x## [1] "Formation R"
class(x)## [1] "character"
Manipulation des vecteurs et des arguments
Les vecteurs sont des variables de R qui permet de stocker à la fois plusieurs données d’une même type. le type peut être numérique, booléen ou chaine. Exemple: l’âge des enquêtés qu’on souhaite stocker sur une variable. Pour créer un vecteur on utilise la fonction c() et à l’intérieur des parenthèses les données sont séparées par “,”.
age=c(17,15,58,33,96,74,79,20,0,50,82,91,72,7,94,55,55,14,40,48,61,34,54,70)
age## [1] 17 15 58 33 96 74 79 20 0 50 82 91 72 7 94 55 55 14 40 48 61 34 54 70
sexe<-gl(2,5, labels=c("Masculin", "Féminin"))
sexe## [1] Masculin Masculin Masculin Masculin Masculin Féminin Féminin Féminin
## [9] Féminin Féminin
## Levels: Masculin Féminin
Si les données sont de différents types, R convertira l’ensemble vers le type le plus général.\ Exemple 1
# crée un vecteur de type character
vect=c(17,17.8,"Formation", FALSE)
vect## [1] "17" "17.8" "Formation" "FALSE"
Exemple 2
# met tout décimal, 1 chiffre après la virgule
vect=c(17,17.8,1, FALSE)
vect## [1] 17.0 17.8 1.0 0.0
On peut créer des vecteurs à l’aide de séquences notamment grâce à des fonctions comme seq, rep, etc. Exemple 1
x=1:20
x## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Exemple 2
# structure de la fonction seq: seq.int(from, to, by,...)
# le dernier paramètre permet d'indiquez un pas
x=seq(0,1,0.1)
x## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Un vecteur peut être de type factor (variable qualitative). Pour en créer, on peut utiliser la fonction gl : Generate Factor Levels Exemple
x<-gl(2,10, labels=c("Homme","femme"))
x## [1] Homme Homme Homme Homme Homme Homme Homme Homme Homme Homme femme femme
## [13] femme femme femme femme femme femme femme femme
## Levels: Homme femme
class(x)## [1] "factor"
C’est aussi exactement
x<-c(rep("Homme",10),rep("femme",10))
x## [1] "Homme" "Homme" "Homme" "Homme" "Homme" "Homme" "Homme" "Homme" "Homme"
## [10] "Homme" "femme" "femme" "femme" "femme" "femme" "femme" "femme" "femme"
## [19] "femme" "femme"
class(x)## [1] "character"
On peut connaitre le nombre d’éléments d’un vecteur à l’aide de la commande length.
age=c(17,15,58,33,96,74,79,20,0,50,82,91,72)
length(age)## [1] 13
On peut determiner la valeur d’un vecteur avec une indexaction
## Une seule valeur
age[4]## [1] 33
## plusieur valeur
age[c(4, 2, 6, 8)]## [1] 33 15 74 20
Prise en compte des valeurs manquantes
Sous R une valeur manquante est matérialisée par NA (Not Available) quelque soit le type du vecteur. Il ne faut pas confondre NA et NULL (vide). En effet:
Exemple avec NA
age1=c(17,15,58,33,NA,74,79,20,0,50,NA,91,72)
length(age1)## [1] 13
Exemple avec NULL
age2=c(17,15,58,33,NULL,74,79,20,0,50,NULL,91,72)
length(age2)## [1] 11
Commandes statistiques de base
Moyenne
Pour calculer la moyenne d’un vecteur (variable) on utilise la commande mean. Si le vecteur présente des valeurs manquantes, on ajoute l’option na.rm=T, T comme TRUE.
## Age moyenne
mean(age)## [1] 52.84615
## Avec des NA
mean(age1, na.rm = T)## [1] 46.27273
Variance
Pour calculer la variance d’un vecteur (variable) on utilise la commande mean. Si le vecteur présente des valeurs manquantes, on ajoute l’option na.rm=T, T comme TRUE.
#variance
var(age)## [1] 1056.974
## Avec des NA
var(age1, na.rm = T)## [1] 949.6182
## Ecart type
sqrt(var(age))## [1] 32.51114
##Ou
sd(age)## [1] 32.51114
Minimum, maximum et l’étendu
## Maximum
max(age)## [1] 96
## Minimul
min(age)## [1] 0
## Etendu
max(age)- mean(age)## [1] 43.15385
Les alternatives
Cette section a pour objectif de voir les syntaxes qui ont pour but d’exécuter des instructions seulement si une certaine condition est satisfaite. Voyons ici deux outils pour créer des alternatives en R : la structure if … else et la fonction switch.
la structure if … else
if ("condition") {
"instructions"
} else {
"instructions"
}
Exemple
# Simulation du lancer d'une pièce de monnaie
lancer <- sample(x = c("Pile", "Face"), size = 1)
# Structure qui affiche ou non un message, en fonction du résultat du lancer
if (isTRUE(lancer == "Pile")) # sans accolades
print("Je gagne!")
# ou encore
if (isTRUE(lancer == "Pile")) { # avec accolades
print("Je gagne!")
}Lorsqu’il y a des instructions à exécuter si la condition est fausse, il faut ajouter un else à l’alternative, suivi des instructions en question. Dans ce cas, il est considéré comme une bonne pratique de toujours encadrer les blocs d’instructions d’accolades (sauf si l’écriture condensée, qui sera présentée plus loin, est utilisée), même s’ils sont composés d’une seule instruction, de façon à retrouver le mot-clé else précédé de } et suivi de { .
Voici un exemple :
if (isTRUE(lancer == "Pile")) {
print("Je gagne!")
} else {
print("Je perds...")
}## [1] "Je perds..."
Structures if … else imbriquées
Plusieurs structures if … else peuvent être imbriquées. Pour ce faire, il suffit d’insérer une autre structure if … else à la place de l’accolade suivant le dernier else, comme suit.
if (<condition_1>) {
<instructions> # exécutées si <condition_1> retourne TRUE
} else if (<condition_2>) {
<instructions> # exécutées si <condition_1> retourne FALSE, mais <condition_2> retourne TRUE
} else {
<instructions> # exécutées si <condition_1> et <condition_2> retournent FALSE
}
Exemple Ecrir un programme qui permet de renseigner la mention selon la note obtenue - note inferieur ou égale à 10: Pas de mention. - note comprise entre 10 et 11: Mention Passable - note comprise entre 12 e 13 : Mention Assez bien - note comprise entre 14 et 15: Mention Bien. - note comprise entre 16 et 17: Mention Tres bien. - note comprise entre 18 et 20: Mention Excellente.
note<-19
if (note<10){
print("Mention de mention")
}else if (note>=10 & note<12){
print("Mention passable")
}else if (note>=12 & note<14){
print("Mention Assez-bien")
}else if (note>=14 & note<16){
print("Mention Bien")
}else if (note>=16 & note<18){
print("Mention trés bien")
}else if (note>=18 & note<=20){
print("Mention Excellente")
}else if (note<0 || n>20){
print("Note est incorrecte")
}## [1] "Mention Excellente"
Fonction switch
La fonction switch est parfois utile pour remplacer plusieurs structures if … else imbriquées. La syntaxe générale d’un appel à la fonction switch est la suivante.
switch(
<expression>,
"resultat_1" = {
<instructions> # exécutées si <expression> retourne "resultat_1"
},
"resultat_2" = {
<instructions> # exécutées si <expression> retourne "resultat_2"
},
.
. # autres paires (résultat, instructions à exécuter) s'il y a lieu
.
{
<instructions> # exécutées si <expression> retourne tout autre résultat
}
)
x <- age
# Structures if ... else imbriquées présentées précédemment, à reproduire
if (is.numeric(x)) {
c(min = min(x), moy = mean(x), var=var(x), Sd=sd(x),max = max(x))
} else if (is.character(x) || is.factor(x)) {
table(x)
} else {
NA
}## min moy var Sd max
## 0.00000 52.84615 1056.97436 32.51114 96.00000
Appel à la fonction switch équivalent
switch(
class(x),
"numeric" = c(min = min(x), moy = mean(x), var=var(x), Sd=sd(x),max = max(x)),
"integer" = c(min = min(x), moy = mean(x), var=var(x), Sd=sd(x),max = max(x)),
"character" = table(x),
"factor" = table(x),
NA
)## min moy var Sd max
## 0.00000 52.84615 1056.97436 32.51114 96.00000
Boucles
for
for (<iterateur> in <ensemble>) {
<instructions>
}
while
while (<condition>) {
<instructions>
}
repeat
repeat {
<instructions>
if (!<condition>) {
break
}
}
Syntaxe générale d’une fonction R
Pour créer une fonction:
<nom_fonction> <- function(<arg_1>, <arg_2>, <arg_3>) {
<instructions> # formant le corps de la fonction
}
Exemple
stats_desc <- function(x) {
if (is.numeric(x)) {
stats <- c(min = min(x), moy = mean(x), max = max(x))
} else if (is.character(x) || is.factor(x)) {
stats <- table(x)
} else {
stats <- NA
}
return(stats)
}
stats_desc(x = age)## min moy max
## 0.00000 52.84615 96.00000
Manipulation des matrices
Une matrice est un tableau de données dont les colonnes sont de même type (numérique, caractére)
Pour une matrice on utilise la commande matrix
K<-matrix(1:20, ncol=5, nrow=4, byrow=FALSE)
K## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
Si byrow=TRUE, la matrice est remplie par ligne. Si byrow=FALSE, la matrice est remplie par colonne.
Pour accéder à un élèment de la matrice, il faut indiquer le num?ro de la ligne et le num?ro de la colonne entre crochet de la mani?re suivante: x[ligne, colonne]
K[2,4] #affiche 14 (ligne :2 et colonne : 4)
K[2,4]## [1] 14
Identifier des colonnes et des lignes par des indices
K[2, ] #affiche la ligne 2 entiérement## [1] 2 6 10 14 18
K[1:2, ] #affiche une matrice contenant les lignes 1et 2 entiérement## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
K[, 4] #affiche la colonne 4 entiérement## [1] 13 14 15 16
On peut construire une matrice ? partir d’un vecteur
v<-c(1,2,4,7,3,5,8,9)
v## [1] 1 2 4 7 3 5 8 9
Pour transfomer ce vecteur en matrice, on utlise la commande suisvante:
l<-matrix(v, ncol=4)
l## [,1] [,2] [,3] [,4]
## [1,] 1 4 3 8
## [2,] 2 7 5 9
On a aussi la possibilité de rennommer les lignes et les colonnes
O<-matrix(v, ncol=2, nrow=4,byrow=TRUE,dimnames=list(c("ligne1","ligne2","ligne3","ligne4" ), c("colonne1", "colonne2")))
O## colonne1 colonne2
## ligne1 1 2
## ligne2 4 7
## ligne3 3 5
## ligne4 8 9
Les opérations sur les matrices
Un certain nombre d’opérations classiques sur les matrices sont préesentés dans la version de base de R. Avant de les présenter, définissons un scalaire a et deux matrices réelles E et B, et une matrice complexe C dont nous nous servirons par la suite.
a<-4
a## [1] 4
E<-matrix(c(2,3,5,4),nrow=2,ncol=2)
E## [,1] [,2]
## [1,] 2 5
## [2,] 3 4
B <- matrix(c(1,2,2,7),nrow=2,ncol=2)
B## [,1] [,2]
## [1,] 1 2
## [2,] 2 7
C <- matrix(c(1,1i,-1i,3),ncol=2)
C## [,1] [,2]
## [1,] 1+0i 0-1i
## [2,] 0+1i 3+0i
Opérations de base
a+E## [,1] [,2]
## [1,] 6 9
## [2,] 7 8
Algébre linéaire dans R
Produit de deux matrices
Soient E et B deux matrices carré. Pour calculer le produit E et B il faut s’assurer que le nombre de colonne de E soit égle au nombre de ligne de B. Au cas écheant on utilisera les commandes suivantes
E%*%B## [,1] [,2]
## [1,] 12 39
## [2,] 11 34
E+B## [,1] [,2]
## [1,] 3 7
## [2,] 5 11
a*E-B## [,1] [,2]
## [1,] 7 18
## [2,] 10 9
calcule de determinat
Pour determiner le determinant de E ou B on utilisera la commande suivante
det(E)## [1] -7
det(B)## [1] 3
Determination d’une Matrice identité d’odre n, (n un entier quelconque).
Pour determiner la matrice identité d’ordre 2, on peut utiliser la commande suivante:
I2 <- diag(rep(1,2))
I2## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
De maniére générale on peut determiner la matrice identité d’orde n:
I10 <- diag(rep(1,10))
I10## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 0 0 0 0 0 0 0 0 0
## [2,] 0 1 0 0 0 0 0 0 0 0
## [3,] 0 0 1 0 0 0 0 0 0 0
## [4,] 0 0 0 1 0 0 0 0 0 0
## [5,] 0 0 0 0 1 0 0 0 0 0
## [6,] 0 0 0 0 0 1 0 0 0 0
## [7,] 0 0 0 0 0 0 1 0 0 0
## [8,] 0 0 0 0 0 0 0 1 0 0
## [9,] 0 0 0 0 0 0 0 0 1 0
## [10,] 0 0 0 0 0 0 0 0 0 1
l’inverse d’une matrice
Dans le cas où le determinant de B est différent de zéro, on peut determiner son inverse
solve(B)## [,1] [,2]
## [1,] 2.3333333 -0.6666667
## [2,] -0.6666667 0.3333333
Transposé d’une matrice
t(B)## [,1] [,2]
## [1,] 1 2
## [2,] 2 7
La cojugué d’une matrice complexe
Conj(C)## [,1] [,2]
## [1,] 1+0i 0+1i
## [2,] 0-1i 3+0i
Matrice triangulaire
Il est parfois utile de récupérer les sous-matrices triangulaires inférieur et supérieure d’une matrice. Cela est possible au moyen des fonctions lower.tri() et upper.tri().
cosidérons la matrice suivante:
M <- matrix(1:16,nrow=4)
M## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
lower.tri(M)## [,1] [,2] [,3] [,4]
## [1,] FALSE FALSE FALSE FALSE
## [2,] TRUE FALSE FALSE FALSE
## [3,] TRUE TRUE FALSE FALSE
## [4,] TRUE TRUE TRUE FALSE
upper.tri(M,diag=TRUE)## [,1] [,2] [,3] [,4]
## [1,] TRUE TRUE TRUE TRUE
## [2,] FALSE TRUE TRUE TRUE
## [3,] FALSE FALSE TRUE TRUE
## [4,] FALSE FALSE FALSE TRUE
M[lower.tri(M)] <- 0
M## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 0 6 10 14
## [3,] 0 0 11 15
## [4,] 0 0 0 16
Calcul des valeurs propres et vecteurs propres
On peut obtenir les valeurs propres et les vecteurs propres d’une matrice au moyen de la fonction eigen().
T<-matrix(1:16, ncol=4)
T## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
eigen(T)## eigen() decomposition
## $values
## [1] 3.620937e+01 -2.209373e+00 1.599839e-15 7.166935e-16
##
## $vectors
## [,1] [,2] [,3] [,4]
## [1,] 0.4140028 0.82289268 -0.5477226 0.1125155
## [2,] 0.4688206 0.42193991 0.7302967 0.2495210
## [3,] 0.5236384 0.02098714 0.1825742 -0.8365883
## [4,] 0.5784562 -0.37996563 -0.3651484 0.4745519
la diagonalisation
Considerons la matrice carré d’ordre 3 definit par :
Z<-matrix(c(-1, -2, -4, 2, -1, 4, 1, -1, 3), ncol=3)
Z## [,1] [,2] [,3]
## [1,] -1 2 1
## [2,] -2 -1 -1
## [3,] -4 4 3
svd(X) retourne (U,D,V) telles que X = UDV’ où U et V sont orthogonales et D est diagonale
svd(Z)## $d
## [1] 6.8233041 2.5049536 0.4095469
##
## $u
## [,1] [,2] [,3]
## [1,] -0.34652823 0.20700968 -0.9149127
## [2,] -0.01458172 -0.97641643 -0.2154027
## [3,] -0.93792620 -0.06130212 0.3413744
##
## $v
## [,1] [,2] [,3]
## [1,] 0.6048970 0.7948377 -0.04829621
## [2,] -0.6492719 0.4571850 -0.60780576
## [3,] -0.4610267 0.3990173 0.79261569
solve(Z,b) retourne x tel que Zx = b
b<-c(1, 2, 3)
solve(Z, b)## [1] -0.8571429 0.4285714 -0.7142857
Pour determiner la partie entiére d’un nombre on utlise la fonction floor
Relation entre vecteur et matrice
considerons le vecteur T suivant:
T<-c(20, 30, 72, 80, 48, 96, 100, 69, 45, 25)
T## [1] 20 30 72 80 48 96 100 69 45 25
pour transformer ce vecteur en matrice
MT<-matrix(T, ncol=5, byrow = TRUE )
MT## [,1] [,2] [,3] [,4] [,5]
## [1,] 20 30 72 80 48
## [2,] 96 100 69 45 25
pour renommer les lignes et les colonnes
tab<-matrix(T, ncol=5, byrow = TRUE, dimnames = list(c("HOMME","FEMME"), c("Orange", "Mango", "Pomme","Bannane", "Autre")))
tab## Orange Mango Pomme Bannane Autre
## HOMME 20 30 72 80 48
## FEMME 96 100 69 45 25
table.complete <- addmargins(tab,FUN=sum,quiet=TRUE)
table.complete## Orange Mango Pomme Bannane Autre sum
## HOMME 20 30 72 80 48 250
## FEMME 96 100 69 45 25 335
## sum 116 130 141 125 73 585
Le tableau de la distribution conjointe (encore appelé tri croisé en fréquences relatives) du couple (X; Y) s’obtient à partir du tableau de contingence matable précédent.
freq.tab<-table.complete/sum(table.complete)
freq.tab## Orange Mango Pomme Bannane Autre sum
## HOMME 0.008547009 0.01282051 0.03076923 0.03418803 0.02051282 0.1068376
## FEMME 0.041025641 0.04273504 0.02948718 0.01923077 0.01068376 0.1431624
## sum 0.049572650 0.05555556 0.06025641 0.05341880 0.03119658 0.2500000
Si l’on veut aussi obtenir les marges, on peut utiliser l’une des instructions suivantes
Total <- sum
freq.table.complete<-addmargins(freq.tab,FUN=sum,quiet=TRUE)
freq.table.complete## Orange Mango Pomme Bannane Autre sum
## HOMME 0.008547009 0.01282051 0.03076923 0.03418803 0.02051282 0.1068376
## FEMME 0.041025641 0.04273504 0.02948718 0.01923077 0.01068376 0.1431624
## sum 0.049572650 0.05555556 0.06025641 0.05341880 0.03119658 0.2500000
## sum 0.099145299 0.11111111 0.12051282 0.10683761 0.06239316 0.5000000
## sum
## HOMME 0.2136752
## FEMME 0.2863248
## sum 0.5000000
## sum 1.0000000
Manupulation des données
Pour aborder cette partie, je vous recommande de télécharger les packages suivants à l’aide de la commande:
install.packages("NomPackage")
Package à telecharger.
- haven
- questionr
- tidyverse
- dplyr
- ggplot2
- plotly
R permet différents types de données:
- A partir de fichier Texte : CSV,
- A partir des logiciels statistiques: Excel, STATA, SPSS, SAS;
- A partir des googlesheets;
- A partir de données spatiales : ShapeFile, Rasters, etc.
- Ou à partir de bases de données.
Dans ce cours, l’importation des formats usuels sera abordé (CVS, Excel, SPSS, STATA. . . ) En général, le format de la base importée est de type data.fram
Pour importer un csv, il est important d’avoir un certain nombre d’infos:
- la 1er ligne contient-elle les noms des variables ?;
- quel est le séparateur ?;
- qu’est-ce qui encadre les données textuelles (” ou ’) ?
- le format de la décimal (. ou ,) ?
- comment sont matérialisés les valeurs manquantes ?
R permet l’importation des fichiers CVS de maniére graphique. Par script, il existe plusieurs fonctions permettant de lire un CVS read.table, read.csv, read.delim etc.
data<-read.delim("chemin/NomBase.csv",header = TRUE, sep = ";", dec = ".")
Pour importer des données de STATA et SPSS, R dispose d’un package par défaut : foreign. Cependant, le package haven de tidyverse est souvent préféré car gérant mieux les variables de type date et factor (vecteur labélisé).
- Pour foreign, les fonctions sont : read.spss pour SPSS, read.dta pour STATA;
- Pour haven, les fonctions sont : read_spss ou read_sav pour SPSS, read_stata pour STATA
- Pour Excel, le package readxl de tidyverse permet d’importer directement de Excel. On a la possibilité de choisir la feuille de données et d’indiquer si les noms des variables sont en entête ou pas.
Savegarder les données
Comme les autres logiciels de traitement de données, R dispose de son propre format de stockage avec comme extension .RData Pour ce faire on procéde comme suit:
save(data, file = "NomBase.Rdata")
De plus on peut sauvegarder aussi les autres objets créés au cours de la session
save(data, objet1,objet2, file = "NomBase.Rdata")
Visualiser la base importée
On peut visualiser la base importée à l’aide de la commande View
View(DataFrame)
La commande names pour afficher les noms des variables dans la base de données. On peut aussi utiliser lookfor de questionr. La fonction str, en plus des noms, affiche le type de la variable et un échantillon des premiéres valeurs.
inspection de la base
Les packages questionr et dplyr fournissent des fonctions pratiques pour décrire une base de données:
- questionr propose describe;
- dplyr propose glimpse
recherche de(s) variable(s)
Lorqu’on travail avec une grande base de données. Il peut étre difficile de repérer une variable. La commande lookfor de questionr pourra nous aider: Il conviendra de lui donner un ou des mots clés pour R affiche l’ensemble des variables ayant ce mot dans leur nom ou description.
library(questionr)## Warning: le package 'questionr' a été compilé avec la version R 4.2.3
data("hdv2003")
lookfor(hdv2003,"lec")## pos variable label col_type missing values
## 14 lecture.bd — fct 0 Non
## Oui
data<-data("hdv2003")Labélisation de la base: décrire les variables.
Pour la gestion des métadonnées, nous utliserons le package labelled. Pour donner la description d’une variable ou le mettre à jour, on pourra utiliser la commande suivante:
Manipulation des données avec dplyr
dplyr est une extension ayant une syntaxe simple (à l’aide de verbe d’action) et très éfficace dans la manipulation des données. Les principales fonctions de dplyr sont : slice, filter, arrange, select, mutate et rename. l’opérateur pipe (%>%) permet d’enchainer plusieurs opérations tout en gardant une syntaxe lisible. ###charger le package
library(dplyr)##
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
##
## filter, lag
## Les objets suivants sont masqués depuis 'package:base':
##
## intersect, setdiff, setequal, union
slice
Permet de sélectionner des lignes du tableau suivant leur position
library(questionr)
data("hdv2003")
head(slice(hdv2003,c(4,100,250)),10)## id age sexe nivetud poids
## 1 4 34 Homme Enseignement superieur y compris technique superieur 5731.6615
## 2 100 19 Femme <NA> 2186.5404
## 3 250 56 Femme 2eme cycle 858.2812
## occup qualif freres.soeurs clso
## 1 Exerce une profession Technicien 1 Non
## 2 Exerce une profession Employe 0 Oui
## 3 Au foyer Profession intermediaire 2 Oui
## relig trav.imp trav.satisf
## 1 Appartenance sans pratique Moins important que le reste Satisfaction
## 2 Appartenance sans pratique Moins important que le reste Equilibre
## 3 Ni croyance ni appartenance <NA> <NA>
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Oui Oui Oui Oui 2
## 2 Non Non Non Oui Oui Oui Non 10
## 3 Non Non Non Oui Oui Oui Non 3
filter: filter ou créer des sous ensembles
Permet de filter un tableau de données autrement dit de sélectionner des variables suivant une condition
head(filter(hdv2003,sexe=="Femme"), 10)## id age sexe nivetud
## 1 1 28 Femme Enseignement superieur y compris technique superieur
## 2 2 23 Femme <NA>
## 3 5 71 Femme Derniere annee d'etudes primaires
## 4 6 35 Femme Enseignement technique ou professionnel court
## 5 7 60 Femme Derniere annee d'etudes primaires
## 6 9 20 Femme <NA>
## 7 11 65 Femme Enseignement superieur y compris technique superieur
## 8 13 63 Femme Derniere annee d'etudes primaires
## 9 14 67 Femme Enseignement technique ou professionnel court
## 10 15 76 Femme A arrete ses etudes, avant la derniere annee d'etudes primaires
## poids occup qualif freres.soeurs clso
## 1 2634.3982 Exerce une profession Employe 8 Oui
## 2 9738.3958 Etudiant, eleve <NA> 2 Oui
## 3 4329.0940 Retraite Employe 0 Oui
## 4 8674.6994 Exerce une profession Employe 5 Non
## 5 6165.8035 Au foyer Ouvrier qualifie 1 Oui
## 6 7808.8721 Etudiant, eleve <NA> 4 Oui
## 7 704.3227 Retraite Employe 3 Oui
## 8 7118.4659 Retraite Employe 1 Oui
## 9 586.7714 Exerce une profession <NA> 5 Oui
## 10 11042.0774 Retraite <NA> 2 Oui
## relig trav.imp trav.satisf
## 1 Ni croyance ni appartenance Peu important Insatisfaction
## 2 Ni croyance ni appartenance <NA> <NA>
## 3 Pratiquant regulier <NA> <NA>
## 4 Ni croyance ni appartenance Le plus important Equilibre
## 5 Appartenance sans pratique <NA> <NA>
## 6 Appartenance sans pratique <NA> <NA>
## 7 Appartenance sans pratique <NA> <NA>
## 8 Appartenance sans pratique <NA> <NA>
## 9 Pratiquant occasionnel Moins important que le reste Satisfaction
## 10 Appartenance sans pratique <NA> <NA>
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Oui Non Non Non 0.0
## 2 Non Non Non Non Non Oui Oui 1.0
## 3 Non Non Non Non Non Non Non 3.0
## 4 Non Non Non Non Non Oui Oui 2.0
## 5 Non Non Oui Oui Non Non Non 2.9
## 6 Non Non Non Non Non Oui Non 2.0
## 7 Non Non Non Oui Oui Oui Non 1.0
## 8 Non Non Non Oui Non Non Non 4.0
## 9 Non Non Non Oui Oui Non Non 1.0
## 10 Non Non Non Oui Non Oui Non 3.0
On peut passer plusieurs conditions
head(filter(hdv2003,sexe=="Femme", age>45),)## id age sexe nivetud
## 1 5 71 Femme Derniere annee d'etudes primaires
## 2 7 60 Femme Derniere annee d'etudes primaires
## 3 11 65 Femme Enseignement superieur y compris technique superieur
## 4 13 63 Femme Derniere annee d'etudes primaires
## 5 14 67 Femme Enseignement technique ou professionnel court
## 6 15 76 Femme A arrete ses etudes, avant la derniere annee d'etudes primaires
## poids occup qualif freres.soeurs clso
## 1 4329.0940 Retraite Employe 0 Oui
## 2 6165.8035 Au foyer Ouvrier qualifie 1 Oui
## 3 704.3227 Retraite Employe 3 Oui
## 4 7118.4659 Retraite Employe 1 Oui
## 5 586.7714 Exerce une profession <NA> 5 Oui
## 6 11042.0774 Retraite <NA> 2 Oui
## relig trav.imp trav.satisf
## 1 Pratiquant regulier <NA> <NA>
## 2 Appartenance sans pratique <NA> <NA>
## 3 Appartenance sans pratique <NA> <NA>
## 4 Appartenance sans pratique <NA> <NA>
## 5 Pratiquant occasionnel Moins important que le reste Satisfaction
## 6 Appartenance sans pratique <NA> <NA>
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Non Non Non Non 3.0
## 2 Non Non Oui Oui Non Non Non 2.9
## 3 Non Non Non Oui Oui Oui Non 1.0
## 4 Non Non Non Oui Non Non Non 4.0
## 5 Non Non Non Oui Oui Non Non 1.0
## 6 Non Non Non Oui Non Oui Non 3.0
Ou filter en utlisant une fonction dans la condition.
head(filter(hdv2003, age==min(age)),2)## id age sexe nivetud poids occup qualif freres.soeurs clso
## 1 162 18 Homme <NA> 4982.964 Etudiant, eleve <NA> 2 Non
## 2 215 18 Homme <NA> 4631.188 Etudiant, eleve <NA> 2 Oui
## relig trav.imp trav.satisf hard.rock lecture.bd
## 1 Appartenance sans pratique <NA> <NA> Non Non
## 2 Ni croyance ni appartenance <NA> <NA> Non Non
## peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Non Oui 3
## 2 Non Oui Non Oui Oui 2
select : selectionner des variables
Elle permet de faire des sélections de colonne(s). Selection de sexe et age par exemple:
head(select(hdv2003, sexe,age),2)## sexe age
## 1 Femme 28
## 2 Femme 23
Sélection de toutes variables sauf religionet nivetud
##select(hdv2003, -religion,-nivetud)On peut utiliser les options starts_with, ends_width, contains ou matches pour sélectionner en tenant compte de contraintes particuliéres.
head(select(hdv2003, starts_with("trav")),2)## trav.imp trav.satisf
## 1 Peu important Insatisfaction
## 2 <NA> <NA>
Rename : renommer une variable
Permet de renommer des colonnes: rename(data,nouveau_nom =ancien_nom).
head(rename(hdv2003, "lecture"="lecture.bd","tv"="heures.tv"),10)## id age sexe nivetud poids
## 1 1 28 Femme Enseignement superieur y compris technique superieur 2634.398
## 2 2 23 Femme <NA> 9738.396
## 3 3 59 Homme Derniere annee d'etudes primaires 3994.102
## 4 4 34 Homme Enseignement superieur y compris technique superieur 5731.662
## 5 5 71 Femme Derniere annee d'etudes primaires 4329.094
## 6 6 35 Femme Enseignement technique ou professionnel court 8674.699
## 7 7 60 Femme Derniere annee d'etudes primaires 6165.803
## 8 8 47 Homme Enseignement technique ou professionnel court 12891.641
## 9 9 20 Femme <NA> 7808.872
## 10 10 28 Homme Enseignement technique ou professionnel long 2277.160
## occup qualif freres.soeurs clso
## 1 Exerce une profession Employe 8 Oui
## 2 Etudiant, eleve <NA> 2 Oui
## 3 Exerce une profession Technicien 2 Non
## 4 Exerce une profession Technicien 1 Non
## 5 Retraite Employe 0 Oui
## 6 Exerce une profession Employe 5 Non
## 7 Au foyer Ouvrier qualifie 1 Oui
## 8 Exerce une profession Ouvrier qualifie 5 Non
## 9 Etudiant, eleve <NA> 4 Oui
## 10 Exerce une profession Autre 2 Non
## relig trav.imp trav.satisf
## 1 Ni croyance ni appartenance Peu important Insatisfaction
## 2 Ni croyance ni appartenance <NA> <NA>
## 3 Ni croyance ni appartenance Aussi important que le reste Equilibre
## 4 Appartenance sans pratique Moins important que le reste Satisfaction
## 5 Pratiquant regulier <NA> <NA>
## 6 Ni croyance ni appartenance Le plus important Equilibre
## 7 Appartenance sans pratique <NA> <NA>
## 8 Ni croyance ni appartenance Peu important Insatisfaction
## 9 Appartenance sans pratique <NA> <NA>
## 10 Pratiquant occasionnel Moins important que le reste Satisfaction
## hard.rock lecture peche.chasse cuisine bricol cinema sport tv
## 1 Non Non Non Oui Non Non Non 0.0
## 2 Non Non Non Non Non Oui Oui 1.0
## 3 Non Non Non Non Non Non Oui 0.0
## 4 Non Non Non Oui Oui Oui Oui 2.0
## 5 Non Non Non Non Non Non Non 3.0
## 6 Non Non Non Non Non Oui Oui 2.0
## 7 Non Non Oui Oui Non Non Non 2.9
## 8 Non Non Oui Oui Oui Non Non 1.0
## 9 Non Non Non Non Non Oui Non 2.0
## 10 Non Non Non Non Non Oui Oui 2.0
arrange: ordonner une base de données
Cette fonction permet de trier un tableau de données suivant un ou plusieurs colonnes:
head(arrange(hdv2003, poids),10)## id age sexe nivetud
## 1 492 34 Homme Enseignement superieur y compris technique superieur
## 2 266 83 Femme Derniere annee d'etudes primaires
## 3 1656 39 Homme Enseignement superieur y compris technique superieur
## 4 1282 56 Homme Derniere annee d'etudes primaires
## 5 1804 74 Femme 1er cycle
## 6 1067 46 Homme Enseignement technique ou professionnel court
## 7 298 50 Femme Derniere annee d'etudes primaires
## 8 417 29 Femme Enseignement technique ou professionnel long
## 9 1500 55 Homme N'a jamais fait d'etudes
## 10 1080 55 Homme Enseignement technique ou professionnel court
## poids occup qualif freres.soeurs clso
## 1 78.07834 Exerce une profession Employe 9 Non
## 2 92.68033 Au foyer Employe 1 Non
## 3 92.93637 Exerce une profession Cadre 2 Non
## 4 127.90122 Exerce une profession Ouvrier specialise 12 Oui
## 5 153.01026 Retraite Cadre 3 Non
## 6 186.48657 Exerce une profession Technicien 2 Non
## 7 189.56697 Autre inactif Employe 0 Non
## 8 194.44285 Chomeur Ouvrier specialise 3 Non
## 9 204.16648 Exerce une profession Ouvrier qualifie 11 Non
## 10 236.28395 Exerce une profession Profession intermediaire 1 Oui
## relig trav.imp trav.satisf
## 1 Pratiquant regulier Peu important Equilibre
## 2 Pratiquant regulier <NA> <NA>
## 3 Ni croyance ni appartenance Moins important que le reste Satisfaction
## 4 Appartenance sans pratique Moins important que le reste Equilibre
## 5 Appartenance sans pratique <NA> <NA>
## 6 Appartenance sans pratique Moins important que le reste Satisfaction
## 7 Pratiquant occasionnel <NA> <NA>
## 8 Ni croyance ni appartenance <NA> <NA>
## 9 Pratiquant regulier Moins important que le reste Satisfaction
## 10 Appartenance sans pratique Moins important que le reste Equilibre
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Oui Oui Oui Oui Oui Oui 1
## 2 Non Non Non Non Non Non Non 1
## 3 Non Non Non Non Oui Oui Oui 1
## 4 Non Non Non Non Non Non Non 1
## 5 Non Non Non Non Oui Non Non 1
## 6 Non Non Oui Oui Oui Non Non 2
## 7 Non Non Non Non Oui Non Oui 6
## 8 Non Non Non Oui Oui Oui Non 4
## 9 Non Non Non Non Oui Non Non 1
## 10 Non Non Non Non Non Non Non 4
On peut trier dans l’ordre décroissant en ajoutant l’option desc()
head(arrange(hdv2003, desc(poids)),10)## id age sexe
## 1 939 23 Femme
## 2 818 53 Homme
## 3 1379 34 Femme
## 4 1637 31 Homme
## 5 20 39 Femme
## 6 1439 45 Femme
## 7 342 59 Femme
## 8 1808 47 Homme
## 9 1341 39 Femme
## 10 1127 89 Femme
## nivetud poids
## 1 Enseignement superieur y compris technique superieur 31092.14
## 2 Enseignement technique ou professionnel court 29657.94
## 3 2eme cycle 29570.79
## 4 1er cycle 29548.79
## 5 Enseignement technique ou professionnel court 27195.84
## 6 Enseignement superieur y compris technique superieur 27021.94
## 7 Enseignement technique ou professionnel court 26983.53
## 8 Enseignement technique ou professionnel court 26204.71
## 9 Enseignement technique ou professionnel court 26178.59
## 10 A arrete ses etudes, avant la derniere annee d'etudes primaires 25986.10
## occup qualif freres.soeurs clso
## 1 Exerce une profession Profession intermediaire 2 Oui
## 2 Exerce une profession Technicien 4 Oui
## 3 Exerce une profession Employe 1 Oui
## 4 Exerce une profession Employe 6 Ne sait pas
## 5 Exerce une profession Ouvrier qualifie 5 Non
## 6 Au foyer <NA> 3 Non
## 7 Autre inactif Profession intermediaire 2 Oui
## 8 Exerce une profession <NA> 2 Oui
## 9 Au foyer Employe 3 Oui
## 10 Autre inactif <NA> 2 Non
## relig trav.imp trav.satisf
## 1 Pratiquant regulier Moins important que le reste Satisfaction
## 2 Appartenance sans pratique Moins important que le reste Satisfaction
## 3 Ni croyance ni appartenance Moins important que le reste Satisfaction
## 4 Pratiquant occasionnel Moins important que le reste Equilibre
## 5 Appartenance sans pratique Moins important que le reste Satisfaction
## 6 Pratiquant occasionnel <NA> <NA>
## 7 NSP ou NVPR <NA> <NA>
## 8 Pratiquant occasionnel Moins important que le reste Satisfaction
## 9 Appartenance sans pratique <NA> <NA>
## 10 Appartenance sans pratique <NA> <NA>
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Non Non Oui Non 0.0
## 2 Non Non Oui Non Oui Oui Non 3.0
## 3 Non Non Non Oui Non Oui Oui 1.0
## 4 Non Non Non Non Non Non Non 4.0
## 5 Non Non Non Non Non Oui Oui 2.7
## 6 Non Non Non Non Non Oui Oui 0.0
## 7 Non Non Non Oui Oui Non Non 2.0
## 8 Non Non Non Non Non Oui Non 1.0
## 9 Non Non Non Non Non Oui Non 5.0
## 10 Non Non Non Non Non Non Non 0.0
On peut mettre plusieurs colonnes en paramètre. On peut aussi utiliser les fonction head, tail ou slice pour afficher le début ou la fin du tableau.
mutate: création de variables.
Permet d’ajouter une ou plusieurs variables à notre tableau de données:
head(mutate(hdv2003, minutes.tv=heures.tv*60, secondes.tv=minutes.tv*60),10)## id age sexe nivetud poids
## 1 1 28 Femme Enseignement superieur y compris technique superieur 2634.398
## 2 2 23 Femme <NA> 9738.396
## 3 3 59 Homme Derniere annee d'etudes primaires 3994.102
## 4 4 34 Homme Enseignement superieur y compris technique superieur 5731.662
## 5 5 71 Femme Derniere annee d'etudes primaires 4329.094
## 6 6 35 Femme Enseignement technique ou professionnel court 8674.699
## 7 7 60 Femme Derniere annee d'etudes primaires 6165.803
## 8 8 47 Homme Enseignement technique ou professionnel court 12891.641
## 9 9 20 Femme <NA> 7808.872
## 10 10 28 Homme Enseignement technique ou professionnel long 2277.160
## occup qualif freres.soeurs clso
## 1 Exerce une profession Employe 8 Oui
## 2 Etudiant, eleve <NA> 2 Oui
## 3 Exerce une profession Technicien 2 Non
## 4 Exerce une profession Technicien 1 Non
## 5 Retraite Employe 0 Oui
## 6 Exerce une profession Employe 5 Non
## 7 Au foyer Ouvrier qualifie 1 Oui
## 8 Exerce une profession Ouvrier qualifie 5 Non
## 9 Etudiant, eleve <NA> 4 Oui
## 10 Exerce une profession Autre 2 Non
## relig trav.imp trav.satisf
## 1 Ni croyance ni appartenance Peu important Insatisfaction
## 2 Ni croyance ni appartenance <NA> <NA>
## 3 Ni croyance ni appartenance Aussi important que le reste Equilibre
## 4 Appartenance sans pratique Moins important que le reste Satisfaction
## 5 Pratiquant regulier <NA> <NA>
## 6 Ni croyance ni appartenance Le plus important Equilibre
## 7 Appartenance sans pratique <NA> <NA>
## 8 Ni croyance ni appartenance Peu important Insatisfaction
## 9 Appartenance sans pratique <NA> <NA>
## 10 Pratiquant occasionnel Moins important que le reste Satisfaction
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Oui Non Non Non 0.0
## 2 Non Non Non Non Non Oui Oui 1.0
## 3 Non Non Non Non Non Non Oui 0.0
## 4 Non Non Non Oui Oui Oui Oui 2.0
## 5 Non Non Non Non Non Non Non 3.0
## 6 Non Non Non Non Non Oui Oui 2.0
## 7 Non Non Oui Oui Non Non Non 2.9
## 8 Non Non Oui Oui Oui Non Non 1.0
## 9 Non Non Non Non Non Oui Non 2.0
## 10 Non Non Non Non Non Oui Oui 2.0
## minutes.tv secondes.tv
## 1 0 0
## 2 60 3600
## 3 0 0
## 4 120 7200
## 5 180 10800
## 6 120 7200
## 7 174 10440
## 8 60 3600
## 9 120 7200
## 10 120 7200
Utilisation du pipe
Il permet d’enchainer plusieurs opérations sans passer par des étapes intermédaires tout en gardant un syntaxe claire.
head(hdv2003 %>% filter(age>=50) %>% arrange(desc(poids)) %>%
select(age, sexe) %>% slice(1:3),10)## age sexe
## 1 53 Homme
## 2 59 Femme
## 3 89 Femme
group_by
Pour la suite, nous utiliserons les données “fligths” du package nycfligths13. groupby permet de définir des sous-groupes à l’intérieur desquels se font les opérations. Prenons par exemple un group_by par mois sur la base flights.
library(nycflights13)## Warning: le package 'nycflights13' a été compilé avec la version R 4.2.3
data("flights")
head(flights %>% group_by(month),10)## # A tibble: 10 × 19
## # Groups: month [1]
## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr>
## 1 2013 1 1 517 515 2 830 819 11 UA
## 2 2013 1 1 533 529 4 850 830 20 UA
## 3 2013 1 1 542 540 2 923 850 33 AA
## 4 2013 1 1 544 545 -1 1004 1022 -18 B6
## 5 2013 1 1 554 600 -6 812 837 -25 DL
## 6 2013 1 1 554 558 -4 740 728 12 UA
## 7 2013 1 1 555 600 -5 913 854 19 B6
## 8 2013 1 1 557 600 -3 709 723 -14 EV
## 9 2013 1 1 557 600 -3 838 846 -8 B6
## 10 2013 1 1 558 600 -2 753 745 8 AA
## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>,
## # dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## # time_hour <dttm>, and abbreviated variable names ¹sched_dep_time,
## # ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
Récupérons par exemple, les deux premiers vols de chaque mois.
flights %>% group_by(month) %>% slice(1:2)## # A tibble: 24 × 19
## # Groups: month [12]
## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr>
## 1 2013 1 1 517 515 2 830 819 11 UA
## 2 2013 1 1 533 529 4 850 830 20 UA
## 3 2013 2 1 456 500 -4 652 648 4 US
## 4 2013 2 1 520 525 -5 816 820 -4 UA
## 5 2013 3 1 4 2159 125 318 56 142 B6
## 6 2013 3 1 50 2358 52 526 438 48 B6
## 7 2013 4 1 454 500 -6 636 640 -4 US
## 8 2013 4 1 509 515 -6 743 814 -31 UA
## 9 2013 5 1 9 1655 434 308 2020 408 VX
## 10 2013 5 1 451 500 -9 641 640 1 US
## # … with 14 more rows, 9 more variables: flight <int>, tailnum <chr>,
## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## # minute <dbl>, time_hour <dttm>, and abbreviated variable names
## # ¹sched_dep_time, ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
Calculons le retard moyen par mois avec l’aide de la fonction mean.
##flights %>% group_by(month) %>% mutate(retard_mensuel=mean(dep))Calculons le retard le plus important pour mois avec l’aide de la fonction max.
Toutefois, la fonction arrange ne tient pas en compte le groupage. Pour trier par groupe, il faudra ajouter l’argument .by_group = TRUE
head(flights %>% group_by(month) %>% arrange(dep_delay),10)## # A tibble: 10 × 19
## # Groups: month [8]
## year month day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
## <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr>
## 1 2013 12 7 2040 2123 -43 40 2352 48 B6
## 2 2013 2 3 2022 2055 -33 2240 2338 -58 DL
## 3 2013 11 10 1408 1440 -32 1549 1559 -10 EV
## 4 2013 1 11 1900 1930 -30 2233 2243 -10 DL
## 5 2013 1 29 1703 1730 -27 1947 1957 -10 F9
## 6 2013 8 9 729 755 -26 1002 955 7 MQ
## 7 2013 10 23 1907 1932 -25 2143 2143 0 EV
## 8 2013 3 30 2030 2055 -25 2213 2250 -37 MQ
## 9 2013 3 2 1431 1455 -24 1601 1631 -30 9E
## 10 2013 5 5 934 958 -24 1225 1309 -44 B6
## # … with 9 more variables: flight <int>, tailnum <chr>, origin <chr>,
## # dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## # time_hour <dttm>, and abbreviated variable names ¹sched_dep_time,
## # ²dep_delay, ³arr_time, ⁴sched_arr_time, ⁵arr_delay
La fonction group_by peut être combinée avec la fonction summarise pour faire des aggrégations
head(flights %>% group_by(month) %>% summarise(dep_moy=mean(dep_delay)),10)## # A tibble: 10 × 2
## month dep_moy
## <int> <dbl>
## 1 1 NA
## 2 2 NA
## 3 3 NA
## 4 4 NA
## 5 5 NA
## 6 6 NA
## 7 7 NA
## 8 8 NA
## 9 9 NA
## 10 10 NA
La fonction summarise a une fonction spéciale n qui donne le nombre de cas. De même, les résultats obtenus peuvent être réutilisés dans les opérations.
flights %>% group_by(month) %>%
summarise(dep_moy=mean(dep_delay, na.rm = T),
dep_min=min(dep_delay, na.rm = T),
dep_max=max(dep_delay, na.rm = T), nombre=n())%>%
mutate(pourcentage=nombre*100/sum(nombre))## # A tibble: 12 × 6
## month dep_moy dep_min dep_max nombre pourcentage
## <int> <dbl> <dbl> <dbl> <int> <dbl>
## 1 1 NA -30 1301 27004 8.02
## 2 2 NA -33 853 24951 7.41
## 3 3 NA -25 911 28834 8.56
## 4 4 NA -21 960 28330 8.41
## 5 5 NA -24 878 28796 8.55
## 6 6 NA -21 1137 28243 8.39
## 7 7 NA -22 1005 29425 8.74
## 8 8 NA -26 520 29327 8.71
## 9 9 NA -24 1014 27574 8.19
## 10 10 NA -25 702 28889 8.58
## 11 11 NA -32 798 27268 8.10
## 12 12 NA -43 896 28135 8.35
Pour enlever le groupage, on utilisera la fonction ungroup.
Divers
Le package dplyr contient aussi quelques fonctions utiles :
- sample_n et sample_frac qui permettent de choisir aléatoirement n lignes ou un pourcentage de lignes dans un tableau de données.
- lag et lead qui permettent de prendre d’avoir une variable retardée ou avancée.
- tally compte le nombre d’observations d’un groupe. distint permet de supprimer les doublons. Il faut l’accompagner de
- l’option .keep_all pour conserver l’ensemble des colonnes du tableau.
Grahiques
ggplot2
ggplot2 est une extension du tidyverse qui permet de générer des graphiques avec une syntaxe cohérente et puissante. Elle nécessite l’apprentissage d’un “mini-langage” supplémentaire, mais permet la construction de graphiques complexes de manière efficace.
Une des particularités de ggplot2 est qu’elle part du principe que les données relatives à un graphique sont stockées dans un tableau de données (data frame, tibble ou autre). ggplot2 fait partie du coeur du tidyverse, elle est donc chargée automatiquement avec :
library(tidyverse)## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0 ✔ purrr 1.0.1
## ✔ tibble 3.1.8 ✔ stringr 1.5.0
## ✔ tidyr 1.3.0 ✔ forcats 0.5.2
## ✔ readr 2.1.3
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
On peut également la charger explicitement avec :
library(ggplot2)
library(questionr)
data(rp2018)
rp <- filter(
rp2018,
departement %in% c("Oise", "Rhône", "Hauts-de-Seine", "Lozère", "Bouches-du-Rhône")
)
ggplot(rp) + geom_histogram(aes(x = cadres))## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(rp) + geom_point(aes(x = dipl_sup, y = cadres))ggplot(rp) +
geom_point(
aes(x = dipl_sup, y = cadres),
color = "darkgreen", size = 3, alpha = 0.3
)geom_boxplot
geom_boxplot permet de représenter des boîtes à moustaches. On lui passe en y la variable numérique dont on veut étudier la répartition, et en x la variable qualitative contenant les classes qu’on souhaite comparer. Ainsi, si on veut comparer la répartition du pourcentage de maisons en fonction du département de la commune, on pourra faire :
ggplot(rp) + geom_boxplot(aes(x = departement, y = maison))geom_bar permet de produire un graphique en bâtons (barplot). On lui passe en x la variable qualitative dont on souhaite représenter l’effectif de chaque modalité.
Par exemple, si on veut afficher le nombre de communes de notre jeu de données pour chaque département :
ggplot(rp) + geom_bar(aes(x = departement))ggplot(rp) +
geom_bar(
aes(x = departement, fill = pop_cl),
position = "dodge"
) ggplot(rp) +
geom_bar(
aes(x = departement, fill = pop_cl),
position = "fill"
)L’add-in esquisse
esquisse est un package développé notamment par Victor Perrier de dreamRs et qui fournit une interface graphique pour la construction de graphiques avec ggplot2.
Pour l’utiliser, il faut évidemment préalablement installer l’extension :
install.packages(“esquisse”)
Pour lancer l’interface, ouvrez le menu Addins dans la barre d’outils de RStudio, et cliquez sur ‘ggplot2’ builder1.