Exercices R pour Statistique & Économétrie
Exercices R pour Statistique & Économétrie
Ewen Gallic 1
[Link] 2015
Logiciel R et programmation
Exercices
Partie 1 : Données
Exercice 1 (manipulation de vecteurs)
Considérons le vecteur suivant : x = 1 2 3 4 5 .
mode(x)
## [1] "numeric"
length(x)
## [1] 5
1. [Link][at][Link]
Exercice 1
"["(x,1) ; "["(x,5)
## [1] 1
## [1] 5
x[1] ; x[5]
## [1] 1
## [1] 5
# Pour le dernier, on peut également faire comme suit :
x[length(x)]
## [1] 5
4. Extraire les trois premier éléments et les stocker dans un vecteur que l’on nommera a ;
a <- x[c(1,2,3)]
(a <- x[1:3])
## [1] 1 2 3
5. Extraire les éléments en position 1, 3, 5 ; les stocker dans un vecteur que l’on nommera b ;
b <- x[c(1,3,5)]
(x + 10)*2
## [1] 22 24 26 28 30
a + b
## [1] 2 5 8
8. Effectuer l’addition suivante : x+a, commenter le résultat, puis regarder le résultat de a+x ;
2
Exercice
Pour ce qui est de l’opération a+x, le résultat est identique (ouf !).
c <- 2
x*c
## [1] 2 4 6 8 10
a * b
## [1] 1 6 15
12. Récupérer les positions des multiples de 2 et les stocker dans un vecteur que l’on nommera ind,
puis conserver uniquement les multiples de 2 de x dans un vecteur que l’on nommera mult_2 ;
3
Exercice 1
x[which(x %% 2 == 0 | x %% 3 == 0)]
## [1] 2 3 4
sum(x)
## [1] 15
x[1] <- 4
x
## [1] 4 2 3 4 5
17. Remplacer le premier élément de x par la valeur NA, puis calculer la somme des éléments de x ;
x[1] <- NA
sum(x)
## [1] NA
sum(x, [Link]=TRUE)
## [1] 14
ls()
## [1] "a" "b" "c" "ind" "mult_2" "x"
rm(x)
rm(list=ls())
Lorsqu’on désire une session fraîche, il est préférable de redémarrer la session plutôt que
de détruire les objets présents dans celle-ci. Le fait de redémarrer la session R décharge
également les packages éventuellement chargés dans la session courante.
4
Exercice
Dans R, TRUE et FALSE sont des booléens, et répondent à une condition logique. Lorsqu’on
additionne des booléens, R les convertit en integer : TRUE prend la valeur 1 et FALSE 0.
2. Évaluer les expressions suivantes : c(1, 4, TRUE), et c(1, 4, TRUE, "bonjour"), commenter ;
c(1, 4, TRUE)
## [1] 1 4 1
c(1, 4, TRUE, "bonjour")
## [1] "1" "4" "TRUE" "bonjour"
Les éléments d’un vecteur doivent tous être de même type. Dans les deux cas, R convertit
les données dans le type le plus général. Ainsi, dans le premier exemple, TRUE est converti
en numeric, dans le second, la présence d’une chaîne de caractères force R à convertir tous
les autres éléments du vecteur en character.
3. Créer une liste que l’on appellera l et qui contient les éléments 1, 4 et TRUE en première, seconde
et troisième positions respectivement ;
4. Extraire le premier élément de la liste l, et afficher son mode. En faire de même avec le troisième
élément, et commenter ;
Contrairement aux vecteurs, les listes peuvent contenir des éléments de classe différente.
Cela fait de la liste un objet très polyvalent.
5
Exercice 2
7. Créer une liste de trois éléments : votre nom, votre prénom, et votre année de naissance. Ces
trois éléments de la liste devront être nommés respectivement "nom", ""prenom" et année de
naissance. Stocker la liste ainsi créée dans un objet nommé moi ;
8. Extraire le prénom de la liste moi de deux manières : en utilisant l’indice, et en utilisant le nommage ;
moi[[2]]
## [1] "Darth"
moi$prenom
## [1] "Darth"
# Remarque : on peut effectuer la recherche de l'indice
which(names(moi) == "prenom")
## [1] 2
9. Créer une liste avec la même structure que celle de moi, en la remplissant avec les informations
d’une autre personne et la nommer toi. Puis, créer la liste personnes, qui contiendra les listes toi
et moi ;
6
Exercice
personnes[[1]]
## $nom
## [1] "Skywalker"
##
## $prenom
## [1] "Luke"
##
## $`année de naissance`
## [1] 19
personnes[[1]]$prenom
## [1] "Luke"
−3 5 6
1. Créer la matrice suivante : A = −1 2 2 ;
1 −1 −1
7
Exercice 3
dim(A)
## [1] 3 3
ncol(A)
## [1] 3
nrow(A)
## [1] 3
length(A)
## [1] 9
A[,2]
## [1] 5 2 -1
A[1,]
## [1] 3 5 6
A[1, 3]
## [1] 6
2 2
5. Extraire la sous-matrice de dimension 2 × 2 du coin inférieur de A, c’est-à-dire ;
−1 −1
A[2:3, 2:3]
## [,1] [,2]
## [1,] 2 2
## [2,] -1 -1
colSums(A)
## [1] 3 6 7
rowSums(A)
## [1] 14 3 -1
7. Afficher la diagonale de A ;
8
Exercice
diag(A)
## [1] 3 2 -1
>
3 à droite de la matrice A et stocker le résultat dans un objet appelé
8. Rajouter le vecteur 1 2
B;
B <- B[,-4]
B
## [,1] [,2] [,3]
## [1,] 3 5 6
## [2,] -1 2 2
## [3,] 1 -1 -1
B[-c(1,3),]
## [1] -1 2 2
A + 10
## [,1] [,2] [,3]
## [1,] 13 15 16
## [2,] 9 12 12
## [3,] 11 9 9
>
12. Ajouter le vecteur 1 2 3 à A;
A + c(1,2,3)
## [,1] [,2] [,3]
## [1,] 4 6 7
## [2,] 1 4 4
## [3,] 4 2 2
9
Exercice 3
diag(3)
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
A + diag(3)
## [,1] [,2] [,3]
## [1,] 4 5 6
## [2,] -1 3 2
## [3,] 1 -1 0
A / 2
## [,1] [,2] [,3]
## [1,] 1.5 2.5 3.0
## [2,] -0.5 1.0 1.0
## [3,] 0.5 -0.5 -0.5
>
15. Multiplier la matrice A par le vecteur 1
2 3 ;
A %*% c(1,2,3)
## [,1]
## [1,] 31
## [2,] 9
## [3,] -4
t(A)
## [,1] [,2] [,3]
## [1,] 3 -1 1
## [2,] 5 2 -1
## [3,] 6 2 -1
10
Exercice
t(A) %*% B
## [,1] [,2] [,3]
## [1,] 11 12 15
## [2,] 12 30 35
## [3,] 15 35 41
crossprod(A,A)
## [,1] [,2] [,3]
## [1,] 11 12 15
## [2,] 12 30 35
## [3,] 15 35 41
11
Exercice 4
On peut soit utiliser la fonction [Link]() du package utils, soit la fonction read_csv()
du package readr (plus rapide sur des gros volumes). Avec la première solution, le contenu
est stocké sous forme de data frame, avec la seconde sous forme de local data frame.
# Téléchargement du fichier
lien <- "[Link]
[Link](lien, destfile = "./[Link]")
df <- [Link]("[Link]")
library(readr)
df <- read_csv("[Link]")
2. Importer à nouveau les données dans R, mais en utilisant fournissant cette fois le l’url directement
à la fonction d’importation ;
Au lieu d’utiliser la fonction read_csv(), on fait appel à read_csv2(), qui fait en réalité
appel l̀a fonction read_delim(), en précisant le caractère de séparation via le paramètre
delim.
lien <- "[Link]
df <- read_csv2(lien)
# Ou de manière équivalente
df <- read_delim(lien, delim=";")
Avec la fonction [Link], il faut indiquer que l’en-tête est absente via le paramètre
header. En utilisant la fonction read_csv(), il suffit de préciser que le nom des colonnes
est absent via le paramètre col_names.
lien <- "[Link]
df <- read_csv(lien, col_names=FALSE)
12
Exercice
Pour importer le contenu d’un classeur Excel dans R, le plus pratique est d’utiliser la
fonction read_excel() du package read_xl. La version de ce package disponible sur le
CRAN à la date d’écriture de cet exercice (0.1.0) ne permet pas encore d’importer un
fichier en ligne. La version courante sur GitHub le permet, donc cette fonctionnalité devrait
apparaître sur le CRAN dans les versions futures du package. Pour l’heure, nous allons
d’abord télécharger le fichier dans le répertoire courant de la session R, puis le charger.
lien <- "[Link]
[Link](lien, destfile = "./[Link]", mode = "wb")
library(readxl)
df <- read_excel("[Link]")
Pour charger un fichier de données au format rda ou RData, on utilise la fonciton load().
Dans cet exemple, le fichier source est sur l’Internet, donc il faut d’abord appliquer la
méthode url() à notre chaîne de caractères indiquant l’emplacement du fichier.
lien <- "[Link]
load(url(lien))
head(notes)
9. Exporter le contenu de l’objet notes de la question précédente au format csv (virgule en séparateur
de champs, point en séparateur décimal, ne pas conserver le numéro des lignes).
Avec la fonction [Link]() du package utils, il est nécessaire de préciser que l’on ne
souhaite pas inclure le nom des lignes via le paramètre [Link], ce qui est fait par défaut
avec la fonction write_csv() du package readr.
[Link](notes, file = "notes_2.csv", [Link] = FALSE)
write_csv(notes, path = "notes_3.csv")
10. Importer le contenu du fichier notes_2012.csv contenu dans l’archive disponible à l’adresse sui-
vante : [Link]
13
Exercice 5
On repère (à la main dans cet exercice) la position du fichier qui nous intéresse, puis à
l’aide de la fonction unz(), on ouvre une connexion vers l’archive.
# Le nom du premier fichier
nom_fichier <- unzip(tf, list=TRUE)$Name[1]
library(readxl)
lien <- "[Link]
notes_2012 <- read_excel(lien, sheet = "notes_2012")
2. Afficher les 6 premières lignes du jeu de données, puis les dimensions du tableau ;
head(notes_2012)
dim(notes_2012)
ncol(notes_2012)
nrow(notes_2012)
3. Conserver uniquement la colonne note_stat du tableau de données notes_2012 dans un objet que
l’on appellera tmp ;
notes_2012$note_stat
notes_2012[, "note_stat"]
select(notes_2012, note_stat)
4. Conserver uniquement les colonnes num_etudiant, note_stat et note_macro dans l’objet tmp ;
5. Remplacer le contenu de tmp par les observations de notes_2012 pour lesquelles l’individu a obtenu
une note de stat supérieure (strictement) à 10 ;
14
Exercice
notes_2012 %>%
filter(note_stat > 10)
6. Remplacer le contenu de tmp par les observations de notes_2012 pour lesquelles l’individu a obtenu
une note comprise dans l’intervalle (10, 15) ;
notes_2012 %>%
filter(note_stat > 10, note_stat < 15)
7. Regarder s’il y a des doublons dans le tableau de données notees_2012 ; le cas échéant, les retirer
du tableau ;
any(duplicated(notes_2012))
# Ou encore
notes_2012 <-
notes_2012 %>%
distinct()
8. Afficher le type des données de la colonne num_etudiant, puis afficher le type de toutes les colonnes
de notes_2012 ;
class(notes_2012$num_etudiant)
lapply(notes_2012, class)
str(notes_2012)
notes_2012 %>%
mutate(note_stat_maj = note_stat + 1)
notes_2012 %>%
mutate(note_stat_maj = note_stat + 1,
note_macro_maj = note_macro + 2,
note_macro_maj = note_macro_maj + 1)
notes_2012 <-
notes_2012 %>%
rename(annee = year)
15
Exercice 5
11. Depuis le fichier notes_etudiants.xlsx (c.f. question 1), importer le contenu des feuilles notes_2013,
notes_2014 et prenoms et le stocker dans les objets notes_2013, notes_2014 et prenoms respec-
tivement ;
12. Empiler le contenu des tableaux de données notes_2012, notes_2013 et notes_2014 dans un objet
que l’on nommera notes ;
13. Fusionner les tableaux notes et prenoms à l’aide d’une jointure gauche, de manière à rajouter les
informations contenues dans le tableau prenoms aux observations de notes. La jointure doit se
faire par le numéro détudiant et l’année, l’objet final viendra remplacer le contenu de notes ;
notes <-
notes %>%
left_join(prenoms, by = c("num_etudiant", "annee"))
14. Trier le tableau notes par années croissantes et notes de macro décroissantes ;
16. Créer une colonne apres_2012 qui prend la valeur TRUE si l’observation concerne une note attribuée
après 2012 ;
16
Exercice
infos_notes <-
notes %>%
group_by(annee) %>%
summarize(moyenne_stat = mean(note_stat, [Link]=TRUE),
sd_stat = sd(note_stat, [Link]=TRUE),
moyenne_macro = mean(note_macro, [Link] = TRUE),
sd_macro = sd(note_macro, [Link]=TRUE))
(b) la moyenne et l’écart-type annuels et par sexe des notes pour chacune des deux matières ;
infos_notes_2 <-
notes %>%
group_by(annee, sexe) %>%
summarize(moyenne_stat = mean(note_stat, [Link]=TRUE),
sd_stat = sd(note_stat, [Link]=TRUE),
moyenne_macro = mean(note_macro, [Link] = TRUE),
sd_macro = sd(note_macro, [Link]=TRUE))
18. En utilisant la fonction gather() du package tidyr, créer un tableau dans lequel chaque ligne
renseigne le numéro d’étudiant, l’année, le prénom, le sexe, l’enseignement (macro ou stat) et la
note ;
library(tidyr)
notes_l <-
notes %>%
gather(key = note, value = enseignement, note_stat, note_macro)
19. En repartant de l’objet obtenu à la question précédente, utiliser la fonction spread() du package
tidyr pour retomber sur le même tableau que notes.
notes_l %>%
spread(note, enseignement)
17
Exercice 6
1. Créer les objets a et b afin qu’il contiennent respectivement les chaînes de caractères suivantes : 23
à 0 et C’est la piquette, Jack ! ;
18
Exercice
library(stringr)
str_length(a)
str_length(b)
str_length(phrases)
4. En utilisant la fonction str_c(), concaténer a et b dans une seule chaîne de caractères, en choisis-
sant la virgule comme caractère de séparation ;
5. Concaténer les deux éléments du vecteur phrases en une seule chaîne de caractères, en les séparant
par le caractère de retour à la ligne, puis utiliser la fonction cat() pour afficher le résultat dans la
console ;
library(stringr)
str_c(phrases, collapse = "\n")
cat(str_c(phrases, collapse = "\n"))
# Différent de :
str_c(phrases, sep = "\n")
6. Appliquer la même fonction que dans la question précédente à l’objet suivant : c(NA, phrases)
et commenter ;
Il y a l’objet NA dans le vecteur pour lequel on souhaite effectuer une concaténation. Cette
dernière échoue donc, et le résultat dans la console, suite à l’appel de la fonction cat()
sera également NA.
7. Mettre en majuscules, puis en minuscules les chaînes du vecteur phrases (afficher le résultat, ne
pas modifier phrases) ;
str_to_upper(phrases)
str_to_lower(phrases)
19
Exercice 6
8. À l’aide de la fonction word() du package stringr, extraire le mot la, puis Jack de la chaîne b ;
word(b, 2)
word(b, -2)
10. À l’aide de la fonction str_detect(), rechercher si le motif piqu puis mauvais sont présents dans
b;
str_detect(b, "piqu")
str_detect(b, "mauvais")
11. À l’aide de la fonction str_detect(), rechercher si le motif piqu est présent dans les éléments du
vecteur phrases ;
str_detect(phrases, "piqu")
12. À l’aide de la fonction str_detect(), rechercher si le motif piqu ou le motif à sont présents dans
les éléments du vecteur phrases ;
str_detect(phrases, "piqu|à")
13. En utilisant la fonction str_locate(), retourner les positions de la première occurence du caractère
a dans la chaîne b, puis essayer avec le caractère w pour observer le résultat retourné ;
str_locate(b, "a")
str_locate(b, "w")
str_locate_all(b, "a")
15. En utilisant la fonction str_replace(), remplacer la première occurence du motif a, par le motif
Z (afficher le résultat, ne pas modifier phrases) ;
20
Exercice
16. Remplacer toutes les occurences de a par Z dans la chaîne b (afficher le résultat, ne pas modifier
phrases) ;
17. Utiliser la fonction str_split() pour séparer la chaîne b en utilisant la virgule comme séparateur
de sous-chaînes ;
str_split(b, ",")
18. Retirer tous les caractères de ponctuation de la chaîne b, puis utiliser la fonction str_trim() sur
le résultat pour retirer les caractères blancs du début et de la fin de la chaîne.
d <- [Link]("2015-08-29")
class(d)
unclass(d)
[Link]([Link]())
3. À l’aide de la fonction [Link](), stocker sous forme de date la chaîne de caractères suivante :
29-08-2015 ;
4. Utiliser les fonctions [Link]() et [Link] pour stocker la chaîne de caractères 2015-08-29
[Link] sous forme de dates dans des objets nommés d_ct et d_lt respectivement ; utiliser ensuite
la fonction unclass() sur les deux objets pour comparer la façon dont R a stocké l’information :
Les objets POSIXct sont stockés en secondes écoulées depuis le premier janvier 1970, les
objets POSIXlt sont une liste dont les élḿeents correspondent aux comosantes de la date.
21
Exercice 7
unclass(d_ct)
unlist(unclass(d_lt))
5. Utiliser la fonction appropriée du package lubridate pour stocker la chaîne de caractères 2015-08-29
sous forme de date ;
library(lubridate)
d_l <- ymd("2015-08-29")
class(d_l)
ymd_hms("2015-08-29 [Link]")
7. Utiliser la fonction ymd_hms() pour stocker la date et l’heure actuelle, en précisant le fuseau horaire,
puis afficher la date et l’heure correspondantes à New York City ;
8. Considérons le vecteur x :
Extraire l’année, le mois, le jour, les heures, les minutes et les secondes du premier élément de x à
l’aide des fonctions appropriées du package lubridate ;
year(x[1])
month(x[1])
day(x[1])
hour(x[1])
minute(x[1])
second(x[1])
22
Exercice
year(x)
month(x)
day(x)
hour(x)
minute(x)
second(x)
Les questions qui suivent permettent de voir la différence entre l’ajout de durées ou
d’époques. Les époques ne prennent pas en compte les années bissextiles. Pour ajouter
une durée, il suffit d’utiliser la fonction appropriée du package lubridate, dont le nom
correspond à la durée au pluriel, et fournir en paramètre la valeur souhaitée. Pour les
époques, il suffit de rajouter le préfixe d au nom de la fonction.
x[1] + 1
x[1] + seconds(1)
— un jour,
x[1] + days(1)
— un mois
x[1] + months(1)
— deux années ;
x[1] + years(2)
x[1] + dyears(2)
On voit bien la différence entre une durée et une époque ici, puisque l’année 2016 est
bissextile :
leap_year(2016)
11. Tester si la date du premier élément de x vient avant celle du second élément ;
12. En utilisant la fonction new_interval() du package lubridate, créer un intervalle de dates entre
les deux éléments de x, puis afficher le nombre de jours, puis le nombre d’heures, puis le nombre
d’années séparant les deux dates ;
13. En utilisant la fonction seq(), créer une séquence de dates avec un intervalle de 5 jours entre
chaque date, commençant à la date du premier élément de x et se terminant à la date du second
élément de x (la séquence sera tronquée avant) ;
23
Exercice 7
14. Convertir en date les deux chaînes de caracères suivantes : Sam 29 Août 2015 et Sat 29 Aug
2015 ;
24