Le langage R est un outil dédié aux calculs statistiques, datant de 1993 et dérivant de S. Open source et donc libre, il est très utilisé un peu partout dans le monde de la donnée.
Sa grande force est d’être maintenant intégré dans un éco-système complet de librairies (appelées aussi packages), permettant d’augmenter ses capacités de traitement et la simplification de l’écriture du code. A l’heure actuelle, il est courant que les auteurs de méthodes innovantes de traitement de données développent une librairie dédiée (ou en intègre une) permettant à tout le monde d’appliquer leurs algorithmes à ses propres données. Le défaut majeur est de choisir les bonnes librairies (efficaces, stables, pérennes, et intégrables en production).
Afin de simplifier l’usage de ce langage, un groupe a développé un environnement de développement intégré (IDE), RStudio (intégré à l’entreprise Posit depuis), intégrant de nombreux outils très intéressant dans le cadre de l’écriture de code R. C’est l’outil de référence pour développer dans ce langage, mais il existe d’autres moyens (Microsoft R Open, Jupyter, intégration dans de nombreux outils…).
Comme indiqué, l’ensemble des librairies constitue une jungle parfois difficile à comprendre. Le choix de tel ou tel autre package, permettant de faire la même chose, relève parfois plus du hasard que d’une réflexion longuement menée. Mais, il existe un ensemble de packages dédié à la Science des données, le tidyverse, regroupant des librairies dédiées aux différentes tâches usuelles. Il est intéressant de choisir celles-ci car elles ont toutes la même philosophie, et leur développement est supporté par Posit, ce qui laisse à penser que cette solution est stable dans le temps. Voici les plus utiles à connaître :
tibble
:
gestion du stockage des données dans une tablereadr
:
importation de données contenues dans des fichiers texte
(.csv
, .dlm
, …)dplyr
:
manipulation de données à la SQL et plus encoreggplot2
:
visualisation de données, selon la grammaire
des graphiquesVoici les étapes à réaliser (dans cet ordre) pour pouvoir travailler sur son ordinateur en local (option à choisir de **préférence*):
install.packages("tidyverse")
dans la partie
Console
Si vous ne souhaitez pas développer en local, ou installer des outils sur votre ordinateur, ou toute autre raison, il est possible de développer du R en ligne, grâce à Posit Cloud :
install.packages("tidyverse")
dans la partie
ConsoleDans la suite, nous allons donc voir quelques unes de ces librairies et leur utilisation. Il faut exécuter les commandes ci-dessous pour voir ce qu’elles réalisent, et ne pas hésiter à les modifier pour les comprendre.
R est un langage dit interprété : chaque commande est exécuté dans ce qu’on appelle donc la console et le résultat, s’il y a, est directement affiché. Si on veut sauvegarder celui-ci, il faut donc le stocker dans une variable.
RStudio est organisé en quatre fenêtres :
On écrit le script dans un fichier texte (que l’on sauvegardera avec
l’extension .R
ou .r
idéalement). Pour
exécuter une ligne de commande écrite dans le fichier, il faut soit
cliquer sur Run, soit faire Ctrl+Enter
(Cmd+Enter sous Mac).
Enfin, il faut comprendre que R travaille dans ce qu’on appelle un répertoire de travail, localisation dans laquelle il va chercher les fichiers extérieurs qu’on veut charger, si on ne définit pas le lien complet. Il y a en effet deux façons de faire référence à un fichier :
C:/Users/fxjollois/chemin/vers/fichiers/monficiher.ext
)
Dans R, il y a différents types de façon de stocker une donnée :
Ce sont les valeurs de base, qui peuvent être
integer
(entier)numeric
(réel)character
Il est à noter que tout est vecteur, même une valeur unique. Ces vecteurs peuvent contenir jusqu’à \(2^{52}-1\) éléments (beaucoup donc). Et toutes les valeurs du vecteur doivent être de même type (entier, réel ou caractère).
Ici, on créé une variable de type réel que l’on nomme a
.
On peut l’afficher, faire des calculs et regarder son type.
a = 12.3456789
print(a) # affichage à l'aide de la fonction print()
## [1] 12.34568
print(a * pi) # pi est une variable déjà présente
## [1] 38.78509
print(class(a)) # par défaut, la classe d'un nombre est numeric (même si on avait écrit a = 12)
## [1] "numeric"
On peut créer des vecteurs de valeurs entières consécutives à l’aide
de l’opérateur :
. Noter qu’écrire uniquement b
dans la console revient à la commande print(b)
.
b = 1:5
print(class(b))
## [1] "integer"
b
## [1] 1 2 3 4 5
Ci-dessous sont présentés différents moyens de créer des vecteurs.
c(1, 3, 5)
## [1] 1 3 5
c("A", "b")
## [1] "A" "b"
c("a", 1:3)
## [1] "a" "1" "2" "3"
vector("numeric", 5)
## [1] 0 0 0 0 0
1:5
## [1] 1 2 3 4 5
5:1
## [1] 5 4 3 2 1
seq(1, 5)
## [1] 1 2 3 4 5
seq(1, 5, length = 9)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
seq(1, 5, by = .5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
seq(1, 5, by = .75)
## [1] 1.00 1.75 2.50 3.25 4.00 4.75
seq(5, 1, by = -.5)
## [1] 5.0 4.5 4.0 3.5 3.0 2.5 2.0 1.5 1.0
rep(1:5, times = 3)
## [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
rep(1:5, each = 2)
## [1] 1 1 2 2 3 3 4 4 5 5
rep(1:5, times = 3, each = 2)
## [1] 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5
runif(10)
## [1] 0.77885716 0.03067273 0.21343935 0.51771513 0.89168899 0.07692706
## [7] 0.69307495 0.27756527 0.79982550 0.33534477
rnorm(10)
## [1] 1.05018420 -0.50198637 -0.17251607 0.97734196 0.14201461 -0.02470641
## [7] -0.43187638 0.71255836 0.09301861 -0.98119694
rnorm(10, 100, 20)
## [1] 93.30640 84.19540 116.06508 113.41353 104.20384 110.58321 115.54420
## [8] 73.20007 111.27257 123.68523
Pour accéder aux éléments d’un vecteur, nous utilisons les
[]
. Dedans, nous pouvons soit mettre des indices, soit un
vecteur booléen de même taille que le vecteur initial. Les fonctions
head()
et tail()
permettent d’avoir les
premières ou les dernières valeurs (6 par défaut, modifiables si
besoin).
x = rnorm(100)
x[1]
## [1] 0.4152454
x[c(1, 5, 10)]
## [1] 0.4152454 -0.2375651 -0.6595805
x[x > 2]
## [1] 2.332812
head(x)
## [1] 0.4152454 -1.6841068 0.4211447 -0.9394892 -0.2375651 -0.3646853
head(x, 10)
## [1] 0.41524544 -1.68410675 0.42114465 -0.93948917 -0.23756514 -0.36468531
## [7] 0.47173201 0.68494911 0.01124546 -0.65958048
tail(x)
## [1] 0.7822878 -1.4356748 1.4589803 -0.1765728 -1.2378866 1.3579520
tail(x, 10)
## [1] -0.8482270 0.1349658 -0.1399162 -0.8364351 0.7822878 -1.4356748
## [7] 1.4589803 -0.1765728 -1.2378866 1.3579520
list
Si nous souhaitons mettre ensemble des éléments de type différents,
il existe aussi des list
(nommées ou non, voire
partiellement), créées via la fonction list()
. Ci-dessous
sont présentées différentes listes et comment on accède aux élément de
celle-ci (avec des [[]]
ou l’opérateur $
suivi
du nom du sous-objet.
a = list(1:5, month.abb, pi)
a
## [[1]]
## [1] 1 2 3 4 5
##
## [[2]]
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
##
## [[3]]
## [1] 3.141593
class(a)
## [1] "list"
b = list(b = 1:5, mois = month.abb, pi = pi)
b
## $b
## [1] 1 2 3 4 5
##
## $mois
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
##
## $pi
## [1] 3.141593
c = list(1:5, mois = month.abb, pi = pi)
c
## [[1]]
## [1] 1 2 3 4 5
##
## $mois
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
##
## $pi
## [1] 3.141593
c[[1]]
## [1] 1 2 3 4 5
c[[2]]
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
c[["mois"]]
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
c$mois
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
d = list(d1 = c, d2 = head(x))
d
## $d1
## $d1[[1]]
## [1] 1 2 3 4 5
##
## $d1$mois
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
##
## $d1$pi
## [1] 3.141593
##
##
## $d2
## [1] 0.4152454 -1.6841068 0.4211447 -0.9394892 -0.2375651 -0.3646853
d$d1
## [[1]]
## [1] 1 2 3 4 5
##
## $mois
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
##
## $pi
## [1] 3.141593
d$d2
## [1] 0.4152454 -1.6841068 0.4211447 -0.9394892 -0.2375651 -0.3646853
d$d1$mois
## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
array
Ce sont des tableaux à \(p\)
dimensions (1, 2 ou plus). Le type matrix
est un sous-type,
à deux dimensions spécifiquement. Tous les éléments du tableau doivent
être du même type (entier, réel ou caractère).
t = array(1:5)
print(t)
## [1] 1 2 3 4 5
Si on souhaite créer des tableaux à 2 dimensions (ce qu’on peut être
amené à faire dans ce cours), il faut utiliser la fonction
matrix()
, qui renvoie un objet matrix
. On
utilise les [,]
pour accéder aux cellules de la matrice,
avec tout ce qui est pour les lignes avant la virgule, et pour les
colonnes après.
matrix(0, nrow = 2, ncol = 5)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
matrix(1:10, 2, 5)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
matrix(1:10, 2, 5, byrow = TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
m = matrix(runif(100), 20, 5)
m
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.4223868 0.5345052 0.7561033 0.31143014 0.69803904
## [2,] 0.5714212 0.6478304 0.9052423 0.29618290 0.70900134
## [3,] 0.8251757 0.6043199 0.1573908 0.67589371 0.44765628
## [4,] 0.5055030 0.1470820 0.6031173 0.38887804 0.48289060
## [5,] 0.1221776 0.8918442 0.7479384 0.08249252 0.51478927
## [6,] 0.3665686 0.2935431 0.9043575 0.43179678 0.95797383
## [7,] 0.7737167 0.3545176 0.7073035 0.70609984 0.40704700
## [8,] 0.4342839 0.3692336 0.2678815 0.70580150 0.55014999
## [9,] 0.6591610 0.9831173 0.3702845 0.71011119 0.76806082
## [10,] 0.9808889 0.1940234 0.7354179 0.33039688 0.39406324
## [11,] 0.6269224 0.7147541 0.8954573 0.75140083 0.99011913
## [12,] 0.8612291 0.3350308 0.7278570 0.78993308 0.97228341
## [13,] 0.1542433 0.5423255 0.5267708 0.29726136 0.48958083
## [14,] 0.2150502 0.6816245 0.2619775 0.20287913 0.77182612
## [15,] 0.4593982 0.7988499 0.7411029 0.06790204 0.57984237
## [16,] 0.8232700 0.4657459 0.5681484 0.22068945 0.24418230
## [17,] 0.7561815 0.3195253 0.9775254 0.23924095 0.05271446
## [18,] 0.8149218 0.5270601 0.4255813 0.15478189 0.30723489
## [19,] 0.2633816 0.1646860 0.3036904 0.15812136 0.11023388
## [20,] 0.9411601 0.1039666 0.6324773 0.68137672 0.47473682
dim(m)
## [1] 20 5
head(m)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.4223868 0.5345052 0.7561033 0.31143014 0.6980390
## [2,] 0.5714212 0.6478304 0.9052423 0.29618290 0.7090013
## [3,] 0.8251757 0.6043199 0.1573908 0.67589371 0.4476563
## [4,] 0.5055030 0.1470820 0.6031173 0.38887804 0.4828906
## [5,] 0.1221776 0.8918442 0.7479384 0.08249252 0.5147893
## [6,] 0.3665686 0.2935431 0.9043575 0.43179678 0.9579738
m[1,]
## [1] 0.4223868 0.5345052 0.7561033 0.3114301 0.6980390
m[1:3,]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.4223868 0.5345052 0.7561033 0.3114301 0.6980390
## [2,] 0.5714212 0.6478304 0.9052423 0.2961829 0.7090013
## [3,] 0.8251757 0.6043199 0.1573908 0.6758937 0.4476563
m[,1]
## [1] 0.4223868 0.5714212 0.8251757 0.5055030 0.1221776 0.3665686 0.7737167
## [8] 0.4342839 0.6591610 0.9808889 0.6269224 0.8612291 0.1542433 0.2150502
## [15] 0.4593982 0.8232700 0.7561815 0.8149218 0.2633816 0.9411601
m[,1:3]
## [,1] [,2] [,3]
## [1,] 0.4223868 0.5345052 0.7561033
## [2,] 0.5714212 0.6478304 0.9052423
## [3,] 0.8251757 0.6043199 0.1573908
## [4,] 0.5055030 0.1470820 0.6031173
## [5,] 0.1221776 0.8918442 0.7479384
## [6,] 0.3665686 0.2935431 0.9043575
## [7,] 0.7737167 0.3545176 0.7073035
## [8,] 0.4342839 0.3692336 0.2678815
## [9,] 0.6591610 0.9831173 0.3702845
## [10,] 0.9808889 0.1940234 0.7354179
## [11,] 0.6269224 0.7147541 0.8954573
## [12,] 0.8612291 0.3350308 0.7278570
## [13,] 0.1542433 0.5423255 0.5267708
## [14,] 0.2150502 0.6816245 0.2619775
## [15,] 0.4593982 0.7988499 0.7411029
## [16,] 0.8232700 0.4657459 0.5681484
## [17,] 0.7561815 0.3195253 0.9775254
## [18,] 0.8149218 0.5270601 0.4255813
## [19,] 0.2633816 0.1646860 0.3036904
## [20,] 0.9411601 0.1039666 0.6324773
m[1,1]
## [1] 0.4223868
m[1:3,1]
## [1] 0.4223868 0.5714212 0.8251757
m[1,1:3]
## [1] 0.4223868 0.5345052 0.7561033
m[1:3,1:3]
## [,1] [,2] [,3]
## [1,] 0.4223868 0.5345052 0.7561033
## [2,] 0.5714212 0.6478304 0.9052423
## [3,] 0.8251757 0.6043199 0.1573908
data.frame
En statistique, nous avons couramment besoin de tables d’individus
(ou d’objets) décrits par des variables. En R, ce type de données est
contenu, de base, dans des data.frame
. Pour information, il
existe un certain nombre de données déjà présentes dans R, dont vous
pouvez obtenir la liste par la fonction data()
exécutée
dans la console. De plus, pour accéder à l’aide d’un jeu de données,
vous pouvez exécuter soit help(<jeu>)
ou
?<jeu>
. Ici, le jeu de données utilisé est
mtcars
.
mtcars
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
class(mtcars)
## [1] "data.frame"
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
names(mtcars)
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
rownames(mtcars)
## [1] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710"
## [4] "Hornet 4 Drive" "Hornet Sportabout" "Valiant"
## [7] "Duster 360" "Merc 240D" "Merc 230"
## [10] "Merc 280" "Merc 280C" "Merc 450SE"
## [13] "Merc 450SL" "Merc 450SLC" "Cadillac Fleetwood"
## [16] "Lincoln Continental" "Chrysler Imperial" "Fiat 128"
## [19] "Honda Civic" "Toyota Corolla" "Toyota Corona"
## [22] "Dodge Challenger" "AMC Javelin" "Camaro Z28"
## [25] "Pontiac Firebird" "Fiat X1-9" "Porsche 914-2"
## [28] "Lotus Europa" "Ford Pantera L" "Ferrari Dino"
## [31] "Maserati Bora" "Volvo 142E"
dim(mtcars)
## [1] 32 11
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
Pour accéder aux données, nous pouvons soit utiliser le même procédé
que pour une matrix
, soit des moyens plus spécifiques.
mtcars[1,]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
mtcars[,1]
## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
mtcars[1]
## mpg
## Mazda RX4 21.0
## Mazda RX4 Wag 21.0
## Datsun 710 22.8
## Hornet 4 Drive 21.4
## Hornet Sportabout 18.7
## Valiant 18.1
## Duster 360 14.3
## Merc 240D 24.4
## Merc 230 22.8
## Merc 280 19.2
## Merc 280C 17.8
## Merc 450SE 16.4
## Merc 450SL 17.3
## Merc 450SLC 15.2
## Cadillac Fleetwood 10.4
## Lincoln Continental 10.4
## Chrysler Imperial 14.7
## Fiat 128 32.4
## Honda Civic 30.4
## Toyota Corolla 33.9
## Toyota Corona 21.5
## Dodge Challenger 15.5
## AMC Javelin 15.2
## Camaro Z28 13.3
## Pontiac Firebird 19.2
## Fiat X1-9 27.3
## Porsche 914-2 26.0
## Lotus Europa 30.4
## Ford Pantera L 15.8
## Ferrari Dino 19.7
## Maserati Bora 15.0
## Volvo 142E 21.4
mtcars[,"mpg"]
## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
mtcars["mpg"]
## mpg
## Mazda RX4 21.0
## Mazda RX4 Wag 21.0
## Datsun 710 22.8
## Hornet 4 Drive 21.4
## Hornet Sportabout 18.7
## Valiant 18.1
## Duster 360 14.3
## Merc 240D 24.4
## Merc 230 22.8
## Merc 280 19.2
## Merc 280C 17.8
## Merc 450SE 16.4
## Merc 450SL 17.3
## Merc 450SLC 15.2
## Cadillac Fleetwood 10.4
## Lincoln Continental 10.4
## Chrysler Imperial 14.7
## Fiat 128 32.4
## Honda Civic 30.4
## Toyota Corolla 33.9
## Toyota Corona 21.5
## Dodge Challenger 15.5
## AMC Javelin 15.2
## Camaro Z28 13.3
## Pontiac Firebird 19.2
## Fiat X1-9 27.3
## Porsche 914-2 26.0
## Lotus Europa 30.4
## Ford Pantera L 15.8
## Ferrari Dino 19.7
## Maserati Bora 15.0
## Volvo 142E 21.4
mtcars$mpg
## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
mtcars["Mazda RX4",]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
mtcars[1:5, c("mpg", "hp", "qsec")]
## mpg hp qsec
## Mazda RX4 21.0 110 16.46
## Mazda RX4 Wag 21.0 110 17.02
## Datsun 710 22.8 93 18.61
## Hornet 4 Drive 21.4 110 19.44
## Hornet Sportabout 18.7 175 17.02
mtcars[c("Mazda RX4", "Hornet Sportabout"), 1:3]
## mpg cyl disp
## Mazda RX4 21.0 6 160
## Hornet Sportabout 18.7 8 360
mtcars[mtcars$mpg > 30,]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
factor
Puisque R est un langage orienté statistique, il dispose d’un type
particulier permettant de coder des variables qualitatives, le type
factor
. Comme nous pouvons le voir en transformant la
variable en numeric
, ce type code chaque modalité
numériquement (en valeur entière de 1 à \(n_{modalité}\)) et garde la liste des
modalités en plus (qu’on peut obtenir avec levels()
).
class(iris$Species)
## [1] "factor"
head(iris$Species)
## [1] setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica
levels(iris$Species)
## [1] "setosa" "versicolor" "virginica"
as.numeric(iris$Species)
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3
## [112] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [149] 3 3
as.character(iris$Species)
## [1] "setosa" "setosa" "setosa" "setosa" "setosa"
## [6] "setosa" "setosa" "setosa" "setosa" "setosa"
## [11] "setosa" "setosa" "setosa" "setosa" "setosa"
## [16] "setosa" "setosa" "setosa" "setosa" "setosa"
## [21] "setosa" "setosa" "setosa" "setosa" "setosa"
## [26] "setosa" "setosa" "setosa" "setosa" "setosa"
## [31] "setosa" "setosa" "setosa" "setosa" "setosa"
## [36] "setosa" "setosa" "setosa" "setosa" "setosa"
## [41] "setosa" "setosa" "setosa" "setosa" "setosa"
## [46] "setosa" "setosa" "setosa" "setosa" "setosa"
## [51] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [56] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [61] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [66] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [71] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [76] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [81] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [86] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [91] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [96] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [101] "virginica" "virginica" "virginica" "virginica" "virginica"
## [106] "virginica" "virginica" "virginica" "virginica" "virginica"
## [111] "virginica" "virginica" "virginica" "virginica" "virginica"
## [116] "virginica" "virginica" "virginica" "virginica" "virginica"
## [121] "virginica" "virginica" "virginica" "virginica" "virginica"
## [126] "virginica" "virginica" "virginica" "virginica" "virginica"
## [131] "virginica" "virginica" "virginica" "virginica" "virginica"
## [136] "virginica" "virginica" "virginica" "virginica" "virginica"
## [141] "virginica" "virginica" "virginica" "virginica" "virginica"
## [146] "virginica" "virginica" "virginica" "virginica" "virginica"
tibble
Le package tibble
permet de définir une nouvelle
structure (tbl_df
), basée sur un
data.frame
.
library(tibble)
as_tibble(mtcars)
## # A tibble: 32 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
Les différences avec un data.frame
sont minimes, mais
importantes :
rownames
factor
Le tidyverse
inclut trois packages permettant
l’importation de données externes, contenues dans des fichiers (ainsi
que l’exportation). Nous allons ici importer des données classiques (150
iris de trois espèces différentes, décrits par 4 variable),
disponibles dans trois formats (à télécharger dans le même répertoire
que votre code) : texte délimité, Excel et SAS.
Les fonctions qu’on va utiliser renvoient un objet de type
tibble
. Pour plus d’options, il faut aller voir l’aide de
chaque package.
Pour cela, nous utilisons le package readr
, qui améliore
les fonctions déjà présentes. Les nouvelles fonctions sont plutôt
performantes, et comprennent les données, ce qui permet de
limiter les besoins de paramétrisation de celles-ci.
library(readr)
iris_txt = read_delim("Iris.txt", delim = "\t")
## Rows: 150 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (1): Species
## dbl (4): Sepal Length, Sepal Width, Petal Length, Petal Width
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Le package readxl
permet donc
de lire des fichiers Excel (quelque soit le format : xlsx
ou xls
). La fonction read_excel()
détecte
justement le format du fichier.
library(readxl)
iris_xlsx = read_excel("Iris.xlsx")
Enfin, pour importer des données SAS mais aussi SPSS et Stata, il
existe le package haven
, avec la
fonction read_sas()
.
library(haven)
iris_sas = read_sas("Iris.sas7bdat")
Pour tout ce qui est manipulation de données, au sens
SQL
, nous disposons du package dplyr
qui fournit
toutes les fonctions utilisées ici. Bien qu’il y ait aussi des fonctions
de base dans R, ce package est préférable.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Vous remarquerez l’utilisation de l’opérateur %>%
pour enchaîner les opérations. Celui-ci est fournit par le package magrittr
, lui
aussi dans le tidyverse. Ce formalisme permet d’avoir un code
plus lisible, car déroulant les étapes les unes après les autres,
contrairement à la programmation classique dans R.
Ici, les deux opérations consistent respectivement à sélectionner des lignes (restriction) ou des colonnes (projection).
mtcars %>% filter(mpg > 30)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
mtcars %>% filter(mpg > 30 & qsec < 19)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
mtcars %>% filter(carb == 8)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Maserati Bora 15 8 301 335 3.54 3.57 14.6 0 1 5 8
mtcars %>% filter(between(mpg, 30, 32))
## mpg cyl disp hp drat wt qsec vs am gear carb
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
mtcars %>% slice(1:5)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
mtcars %>% slice(25:n()) # n() indique le nombre de lignes de la table
## mpg cyl disp hp drat wt qsec vs am gear carb
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
mtcars %>% slice(seq(1, n(), by = 4))
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
head(mtcars) %>% select(mpg)
## mpg
## Mazda RX4 21.0
## Mazda RX4 Wag 21.0
## Datsun 710 22.8
## Hornet 4 Drive 21.4
## Hornet Sportabout 18.7
## Valiant 18.1
head(mtcars) %>% select(qsec, mpg, hp)
## qsec mpg hp
## Mazda RX4 16.46 21.0 110
## Mazda RX4 Wag 17.02 21.0 110
## Datsun 710 18.61 22.8 93
## Hornet 4 Drive 19.44 21.4 110
## Hornet Sportabout 17.02 18.7 175
## Valiant 20.22 18.1 105
head(mtcars) %>% select(5, 3, 9)
## drat disp am
## Mazda RX4 3.90 160 1
## Mazda RX4 Wag 3.90 160 1
## Datsun 710 3.85 108 1
## Hornet 4 Drive 3.08 258 0
## Hornet Sportabout 3.15 360 0
## Valiant 2.76 225 0
head(mtcars) %>% select(starts_with("c")) # d'autres possibilités de ce type existent (voir ?select_helpers)
## cyl carb
## Mazda RX4 6 4
## Mazda RX4 Wag 6 4
## Datsun 710 4 1
## Hornet 4 Drive 6 1
## Hornet Sportabout 8 2
## Valiant 6 1
head(mtcars) %>% select(cyl)
## cyl
## Mazda RX4 6
## Mazda RX4 Wag 6
## Datsun 710 4
## Hornet 4 Drive 6
## Hornet Sportabout 8
## Valiant 6
head(mtcars) %>% select(cyl) %>% distinct()
## cyl
## Mazda RX4 6
## Datsun 710 4
## Hornet Sportabout 8
La fonction arrange()
permet le tri sur une ou plusieurs
variables, avec desc()
pour indiquer un ordre
décroissant.
head(mtcars) %>% arrange(mpg)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
head(mtcars) %>% arrange(am, mpg)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
head(mtcars) %>% arrange(desc(mpg))
## mpg cyl disp hp drat wt qsec vs am gear carb
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Comme vous avez pu le remarquer, dans les différents exemples
ci-dessus, le nom des lignes est supprimé. Pour le récupérer, nous
utilisons la fonction rownames_to_column()
, qui permet de
le transformer en variable.
head(mtcars) %>% rownames_to_column(var = "car")
## car mpg cyl disp hp drat wt qsec vs am gear carb
## 1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## 2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## 3 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## 4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## 5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## 6 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Pour ajouter une variable, il existe la fonction
mutate()
.
head(mtcars) %>% mutate(ratio = wt / hp, zero = 0, wt = NULL, hp = NULL)
## mpg cyl disp drat qsec vs am gear carb ratio zero
## Mazda RX4 21.0 6 160 3.90 16.46 0 1 4 4 0.02381818 0
## Mazda RX4 Wag 21.0 6 160 3.90 17.02 0 1 4 4 0.02613636 0
## Datsun 710 22.8 4 108 3.85 18.61 1 1 4 1 0.02494624 0
## Hornet 4 Drive 21.4 6 258 3.08 19.44 1 0 3 1 0.02922727 0
## Hornet Sportabout 18.7 8 360 3.15 17.02 0 0 3 2 0.01965714 0
## Valiant 18.1 6 225 2.76 20.22 1 0 3 1 0.03295238 0
head(mtcars) %>% mutate(n = row_number(), rang_mpg = min_rank(desc(mpg)))
## mpg cyl disp hp drat wt qsec vs am gear carb n rang_mpg
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 1 3
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 2 3
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 3 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 4 2
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 5 5
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 6 6
Si l’on veut garder uniquement la variable nouvellement créée, on
utilise transmute()
.
head(mtcars) %>% transmute(ratio = wt / hp)
## ratio
## Mazda RX4 0.02381818
## Mazda RX4 Wag 0.02613636
## Datsun 710 0.02494624
## Hornet 4 Drive 0.02922727
## Hornet Sportabout 0.01965714
## Valiant 0.03295238
Pour résumer une ou plusieurs variables, nous utilisons la fonction
summarise()
.
mtcars %>% summarise(
n = n(),
mpg_mean = mean(mpg),
nbtype_carb = n_distinct(carb)
)
## n mpg_mean nbtype_carb
## 1 32 20.09062 6
Et si l’on souhaite effecture par groupes déterminés par les
modalités d’une variable, il existe la fonction
group_by()
.
mtcars %>%
group_by(cyl) %>%
summarise(
n = n(),
mpg_mean = mean(mpg),
nbtype_carb = n_distinct(carb)
)
## # A tibble: 3 × 4
## cyl n mpg_mean nbtype_carb
## <dbl> <int> <dbl> <int>
## 1 4 11 26.7 2
## 2 6 7 19.7 3
## 3 8 14 15.1 4
Pour tester les méthodes, nous créons une nouvelle table
engine
, indiquant le type en fonction de la valeur de
cyl
. Vous remarquerez que par rapport à
mtcars
, il y a une valeur en moins (4) et une valeur en
plus (12).
engine = tibble(
cyl = c(6, 8, 12),
type = c("medium", "big", "very big")
)
Nous pouvons maintenant utiliser les différentes fonctions de jointure disponibles.
mtcars %>% inner_join(engine)
## Joining with `by = join_by(cyl)`
## mpg cyl disp hp drat wt qsec vs am gear carb type
## 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 medium
## 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 medium
## 3 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 medium
## 4 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 big
## 5 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 medium
## 6 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 big
## 7 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 medium
## 8 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 medium
## 9 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 big
## 10 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 big
## 11 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 big
## 12 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 big
## 13 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 big
## 14 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 big
## 15 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 big
## 16 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 big
## 17 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 big
## 18 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 big
## 19 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 big
## 20 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 medium
## 21 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 big
mtcars %>% left_join(engine)
## Joining with `by = join_by(cyl)`
## mpg cyl disp hp drat wt qsec vs am gear carb type
## 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 medium
## 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 medium
## 3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 <NA>
## 4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 medium
## 5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 big
## 6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 medium
## 7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 big
## 8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 <NA>
## 9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 <NA>
## 10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 medium
## 11 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 medium
## 12 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 big
## 13 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 big
## 14 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 big
## 15 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 big
## 16 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 big
## 17 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 big
## 18 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 <NA>
## 19 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 <NA>
## 20 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 <NA>
## 21 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 <NA>
## 22 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 big
## 23 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 big
## 24 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 big
## 25 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 big
## 26 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 <NA>
## 27 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 <NA>
## 28 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 <NA>
## 29 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 big
## 30 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 medium
## 31 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 big
## 32 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 <NA>
mtcars %>% right_join(engine)
## Joining with `by = join_by(cyl)`
## mpg cyl disp hp drat wt qsec vs am gear carb type
## 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 medium
## 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 medium
## 3 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 medium
## 4 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 big
## 5 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 medium
## 6 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 big
## 7 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 medium
## 8 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 medium
## 9 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 big
## 10 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 big
## 11 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 big
## 12 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 big
## 13 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 big
## 14 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 big
## 15 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 big
## 16 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 big
## 17 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 big
## 18 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 big
## 19 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 big
## 20 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 medium
## 21 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 big
## 22 NA 12 NA NA NA NA NA NA NA NA NA very big
mtcars %>% full_join(engine)
## Joining with `by = join_by(cyl)`
## mpg cyl disp hp drat wt qsec vs am gear carb type
## 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 medium
## 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 medium
## 3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 <NA>
## 4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 medium
## 5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 big
## 6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 medium
## 7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 big
## 8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 <NA>
## 9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 <NA>
## 10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 medium
## 11 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 medium
## 12 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 big
## 13 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 big
## 14 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 big
## 15 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 big
## 16 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 big
## 17 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 big
## 18 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 <NA>
## 19 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 <NA>
## 20 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 <NA>
## 21 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 <NA>
## 22 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 big
## 23 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 big
## 24 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 big
## 25 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 big
## 26 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 <NA>
## 27 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 <NA>
## 28 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 <NA>
## 29 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 big
## 30 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 medium
## 31 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 big
## 32 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 <NA>
## 33 NA 12 NA NA NA NA NA NA NA NA NA very big
mtcars %>% semi_join(engine)
## Joining with `by = join_by(cyl)`
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
mtcars %>% anti_join(engine)
## Joining with `by = join_by(cyl)`
## mpg cyl disp hp drat wt qsec vs am gear carb
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Il est parfois utile de modifer la structure des données, par exemple
dans le cadre d’une visualisation de données avec ggplot
que nous verrons plus tard. Dans ce cas, plutôt que d’avoir un tableau
individus décrits par des variables, il est nécessaire d’avoir un
tableau à trois variables : individu, variable, valeur de la variable.
Le package tidyr
contient les fonctions nécessaires pour faire les opérations dans les
deux sens (et donc de pouvoir faire une transposée en réalisant une
double opération).
Pour créer une table longue à partir d’une table
large, nous utilisons pivot_wider()
.
library(tidyr)
tab_longue = mtcars %>%
rownames_to_column("car") %>%
as_tibble() %>%
pivot_longer(-car)
tab_longue
## # A tibble: 352 × 3
## car name value
## <chr> <chr> <dbl>
## 1 Mazda RX4 mpg 21
## 2 Mazda RX4 cyl 6
## 3 Mazda RX4 disp 160
## 4 Mazda RX4 hp 110
## 5 Mazda RX4 drat 3.9
## 6 Mazda RX4 wt 2.62
## 7 Mazda RX4 qsec 16.5
## 8 Mazda RX4 vs 0
## 9 Mazda RX4 am 1
## 10 Mazda RX4 gear 4
## # ℹ 342 more rows
A l’inverse, pour avoir une table large à partir d’une table
longue, c’est la fonction spread()
. On réalise ici
la transposée de la table mtcars
.
tab_large = tab_longue %>%
pivot_wider(names_from = name, values_from = value)
tab_large
## # A tibble: 32 × 12
## car mpg cyl disp hp drat wt qsec vs am gear carb
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 Mazda RX4 … 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 Datsun 710 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 Hornet 4 D… 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 Hornet Spo… 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 Merc 240D 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 Merc 230 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
Le package stringr
permet de
gérer les chaînes de caractères de manière plus simple que les fonctions
de base. Voici quelques exemples de manipulations classiques.
library(stringr)
mt = mtcars %>% rownames_to_column("car")
str_length(mt$car)
## [1] 9 13 10 14 17 7 10 9 8 8 9 10 10 11 18 19 17 8 11 14 13 16 11 10 16
## [26] 9 13 12 14 12 13 10
str_c(mt$car, collapse = ", ")
## [1] "Mazda RX4, Mazda RX4 Wag, Datsun 710, Hornet 4 Drive, Hornet Sportabout, Valiant, Duster 360, Merc 240D, Merc 230, Merc 280, Merc 280C, Merc 450SE, Merc 450SL, Merc 450SLC, Cadillac Fleetwood, Lincoln Continental, Chrysler Imperial, Fiat 128, Honda Civic, Toyota Corolla, Toyota Corona, Dodge Challenger, AMC Javelin, Camaro Z28, Pontiac Firebird, Fiat X1-9, Porsche 914-2, Lotus Europa, Ford Pantera L, Ferrari Dino, Maserati Bora, Volvo 142E"
str_sub(mt$car, 1, 3)
## [1] "Maz" "Maz" "Dat" "Hor" "Hor" "Val" "Dus" "Mer" "Mer" "Mer" "Mer" "Mer"
## [13] "Mer" "Mer" "Cad" "Lin" "Chr" "Fia" "Hon" "Toy" "Toy" "Dod" "AMC" "Cam"
## [25] "Pon" "Fia" "Por" "Lot" "For" "Fer" "Mas" "Vol"
Une expression régulière permet de décrire une chaîne de caractères, pour retrouver toutes les chaînes correspondant à la description. C’est un outil très puissant, et pas forcément simple à maîtriser.
str_subset(mt$car, "Merc")
## [1] "Merc 240D" "Merc 230" "Merc 280" "Merc 280C" "Merc 450SE"
## [6] "Merc 450SL" "Merc 450SLC"
str_subset(mt$car, "[0-9]")
## [1] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive"
## [5] "Duster 360" "Merc 240D" "Merc 230" "Merc 280"
## [9] "Merc 280C" "Merc 450SE" "Merc 450SL" "Merc 450SLC"
## [13] "Fiat 128" "Camaro Z28" "Fiat X1-9" "Porsche 914-2"
## [17] "Volvo 142E"
str_detect(mt$car, "[0-9]")
## [1] TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
## [13] TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
## [25] FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
str_match(mt$car, "(.+)[ ](.+)")
## [,1] [,2] [,3]
## [1,] "Mazda RX4" "Mazda" "RX4"
## [2,] "Mazda RX4 Wag" "Mazda RX4" "Wag"
## [3,] "Datsun 710" "Datsun" "710"
## [4,] "Hornet 4 Drive" "Hornet 4" "Drive"
## [5,] "Hornet Sportabout" "Hornet" "Sportabout"
## [6,] NA NA NA
## [7,] "Duster 360" "Duster" "360"
## [8,] "Merc 240D" "Merc" "240D"
## [9,] "Merc 230" "Merc" "230"
## [10,] "Merc 280" "Merc" "280"
## [11,] "Merc 280C" "Merc" "280C"
## [12,] "Merc 450SE" "Merc" "450SE"
## [13,] "Merc 450SL" "Merc" "450SL"
## [14,] "Merc 450SLC" "Merc" "450SLC"
## [15,] "Cadillac Fleetwood" "Cadillac" "Fleetwood"
## [16,] "Lincoln Continental" "Lincoln" "Continental"
## [17,] "Chrysler Imperial" "Chrysler" "Imperial"
## [18,] "Fiat 128" "Fiat" "128"
## [19,] "Honda Civic" "Honda" "Civic"
## [20,] "Toyota Corolla" "Toyota" "Corolla"
## [21,] "Toyota Corona" "Toyota" "Corona"
## [22,] "Dodge Challenger" "Dodge" "Challenger"
## [23,] "AMC Javelin" "AMC" "Javelin"
## [24,] "Camaro Z28" "Camaro" "Z28"
## [25,] "Pontiac Firebird" "Pontiac" "Firebird"
## [26,] "Fiat X1-9" "Fiat" "X1-9"
## [27,] "Porsche 914-2" "Porsche" "914-2"
## [28,] "Lotus Europa" "Lotus" "Europa"
## [29,] "Ford Pantera L" "Ford Pantera" "L"
## [30,] "Ferrari Dino" "Ferrari" "Dino"
## [31,] "Maserati Bora" "Maserati" "Bora"
## [32,] "Volvo 142E" "Volvo" "142E"
str_split(mt$car, " ")
## [[1]]
## [1] "Mazda" "RX4"
##
## [[2]]
## [1] "Mazda" "RX4" "Wag"
##
## [[3]]
## [1] "Datsun" "710"
##
## [[4]]
## [1] "Hornet" "4" "Drive"
##
## [[5]]
## [1] "Hornet" "Sportabout"
##
## [[6]]
## [1] "Valiant"
##
## [[7]]
## [1] "Duster" "360"
##
## [[8]]
## [1] "Merc" "240D"
##
## [[9]]
## [1] "Merc" "230"
##
## [[10]]
## [1] "Merc" "280"
##
## [[11]]
## [1] "Merc" "280C"
##
## [[12]]
## [1] "Merc" "450SE"
##
## [[13]]
## [1] "Merc" "450SL"
##
## [[14]]
## [1] "Merc" "450SLC"
##
## [[15]]
## [1] "Cadillac" "Fleetwood"
##
## [[16]]
## [1] "Lincoln" "Continental"
##
## [[17]]
## [1] "Chrysler" "Imperial"
##
## [[18]]
## [1] "Fiat" "128"
##
## [[19]]
## [1] "Honda" "Civic"
##
## [[20]]
## [1] "Toyota" "Corolla"
##
## [[21]]
## [1] "Toyota" "Corona"
##
## [[22]]
## [1] "Dodge" "Challenger"
##
## [[23]]
## [1] "AMC" "Javelin"
##
## [[24]]
## [1] "Camaro" "Z28"
##
## [[25]]
## [1] "Pontiac" "Firebird"
##
## [[26]]
## [1] "Fiat" "X1-9"
##
## [[27]]
## [1] "Porsche" "914-2"
##
## [[28]]
## [1] "Lotus" "Europa"
##
## [[29]]
## [1] "Ford" "Pantera" "L"
##
## [[30]]
## [1] "Ferrari" "Dino"
##
## [[31]]
## [1] "Maserati" "Bora"
##
## [[32]]
## [1] "Volvo" "142E"
Ici, c’est le package lubridate
qu’il
faut utiliser pour manipuler facilement les dates, comme dans les
exemples ci-dessous.
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
now()
## [1] "2025-02-18 15:08:50 CET"
today = today()
today
## [1] "2025-02-18"
year(today)
## [1] 2025
month(today)
## [1] 2
month(today, label = TRUE)
## [1] Feb
## 12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
month(today, label = TRUE, abbr = FALSE)
## [1] February
## 12 Levels: January < February < March < April < May < June < ... < December
day(today)
## [1] 18
mday(today)
## [1] 18
wday(today)
## [1] 3
wday(today, label = TRUE)
## [1] Tue
## Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
wday(today, label = TRUE, week_start = 1)
## [1] Tue
## Levels: Mon < Tue < Wed < Thu < Fri < Sat < Sun
wday(today, week_start = 1)
## [1] 2
yday(today)
## [1] 49
Ce package permet de définir des périodes, et donc de les ajouter à une date (par exemple, pour avoir la date un an après un évènement).
today + period(week = 1, day = 3)
## [1] "2025-02-28"
today + period("1W 3D")
## [1] "2025-02-28"
today - years(1) - days(10)
## [1] "2024-02-08"
On peut avoir faire des différences entre dates (par défaut en jour), et avoir cette valeur en secondes ou en années.
bday = ymd("19771114")
diff = today - bday
diff
## Time difference of 17263 days
as.period(diff)
## [1] "17263d 0H 0M 0S"
as.duration(diff)
## [1] "1491523200s (~47.26 years)"
Enfin, on peut même évaluer si une date est dans un intervale ou non.
nextyear = today + years(1)
int = interval(today, nextyear)
ymd("20190101") %within% int
## [1] FALSE
ymd("20191101") %within% int
## [1] FALSE
Pour information, la librairie hms
permet elle de
gérer les heures, minutes et secondes mais nous ne les verrons pas
ici.
La banque mondiale fournit un grand nombre de données, dont des indicateurs de gouvernance au niveau mondial (voir ici), pour la période 1996-2016.
Vous trouverez les informations dans ces quatre fichiers :
tibble
tibble
TypeCode
est "EST"
."CC"
et le type "EST"
,
quelles sont les valeurs moyenne, maximale et minimale ? (utiliser la
table longue)"Estimate"
.