R et son éco-système

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 table
  • readr : importation de données contenues dans des fichiers texte (.csv, .dlm, …)
  • dplyr : manipulation de données à la SQL et plus encore
  • ggplot2 : visualisation de données, selon la grammaire des graphiques

A faire pour la suite du cours

Voici les étapes à réaliser (dans cet ordre) pour pouvoir travailler sur son ordinateur en local (option à choisir de **préférence*):

  1. Installer le langage R : https://cran.rstudio.com/
  2. Installer le logiciel RStudio : https://posit.co/download/rstudio-desktop/
  3. Lancer RStudio
  4. Installer les librairies tidyverse : commande install.packages("tidyverse") dans la partie Console
    • Cliquer sur Oui lorsqu’il vous propose de créer un nouveau dossier pour stocker les librairies

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 :

  1. Créer un compte (possibilité de se connecter via un compte Google par exemple)
  2. Créer un nouveau projet et cliquer dessus
  3. Vous avez un RStudio en ligne
  4. Installer les librairies tidyverse : commande install.packages("tidyverse") dans la partie Console

Dans 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, RStudio et organisation de son travail

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 :

  • Console, souvent en mode onglet avec Terminal, Render et Background Jobs
  • Environment (liste des objets créés), souvent en mode onglet avec History, Connections et Tutorial
  • Contenu des fichiers ouverts (script, Rmarkdown ou autre)
  • Files, souvent en mode onglet avec Plots, Packages, Help, Viewer et Presentation

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 :

  • Adressage relatif : on indique le chemin par rapport à notre position (i.e. le répertoire de travail ici)
    • Intéressant car si on place tout dans le répertoire (même si on met des sous-répertoires), il suffit de copier le répertoire complet pour que tout fonctionne toujours
    • A PRIVILEGIER dans le cadre de ce cours
  • Adressage absolu : on indique le chemin complet (par exemple C:/Users/fxjollois/chemin/vers/fichiers/monficiher.ext)
    • Intéressant si on est en mode développement, puis test puis production, si le fichier est sur un serveur dédié dans l’organisation
    • PLUTOT A EVITER, sauf si adressage vers fichier sur le web

Structure de données

Dans R, il y a différents types de façon de stocker une donnée :

Types simples

Ce sont les valeurs de base, qui peuvent être

  • integer (entier)
  • numeric (réel)
  • character
  • d’autres types plus spécifiques (fonction, appel…)

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

Type 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

Type 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 :

  • il n’y a plus de rownames
  • les noms de variables ne sont pas modifiées (il est possible d’avoir des espaces dedans)
  • lors de la création, les chaînes de caractères ne sont pas transformés en factor
  • à l’affichage, il n’y a que les deix premières lignes qui sont affichés, et les premières colonnes jusqu’à la largeur possible. Une phrase est ajoutée à la fin pour dire combien de lignes (et de colonnes si besoin) ne sont pas affichés. On voit aussi le type de chaque colonne

Importation de données

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.

Texte délimité

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.

Fichier Excel

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")

Fichier SAS

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")

Interrogation de données

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.

Restriction et projection

Ici, les deux opérations consistent respectivement à sélectionner des lignes (restriction) ou des colonnes (projection).

Restriction par filtre

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

Sélection de lignes par indices

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

Projection

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

Suppression des doublons

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

Tri

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

Ajout de variables

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

Calcul d’agrégat

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

Jointure

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

Manipulations spécifiques

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

Données spécifiques

Chaînes de caractères

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"

Expressions régulières

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"

Dates

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

Durées et intervales

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.

A faire

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 :

  1. Importer les données dans quatre variables tibble
  2. Créer la table des valeurs avec une ligne par pays | indicateur | année, que vous stockerez dans un cinquième tibble
  3. Donner le nombre de pays présent dans les données
  4. Top des pays selon le contrôle de la corruption
    1. Dans la table initiales des valeurs, ne retenir que les valeurs dont le TypeCode est "EST".
    2. Pour la série "CC" et le type "EST", quelles sont les valeurs moyenne, maximale et minimale ? (utiliser la table longue)
    3. Je veux les mêmes informations, mais pour chaque code de pays
    4. Maintenant, on souhaite classer les pays par ordre décroissant de la valeur moyenne.
    5. Pour finaliser le tableau, on souhaite avoir les noms des pays plutôt que le code (pas les deux informations - nom du pays en premier)
  5. Evolution des indicateurs de la France sur la période analysée
    1. Donner toutes les informations concernant la France (années en colonnes)
    2. Dans ce résultat, on ne souhaite que les valeurs dont le type est "Estimate".
    3. Ce tableau n’étant pas très clair, nous allons ajouter en début de tableau les noms des séries et supprimer toutes les informations inutiles.
    4. Maintenant, nous souhaitons un tableau devant contenir en ligne les années et en colonnes les séries. On va en quelque sorte réaliser une transposée de la table précédente.
  6. Pour quel pays (nom du pays) y a t’il des données manquantes ? et en quelle quantité ? (trier les pays dans l’ordre décroissant du nombre de valeurs manquantes)