Présentation de R et de son environnement

Le logiciel R est un langage dédié à la statistique. Celui-ci est interprété (i.e. exécuté à la volée). Pour simplifier son utilisation, il est possible d’écrire des scripts contenant plusieurs commandes à exécuter. Il a l’avantage d’être open source, et surtout d’être très utilisé par la communauté scientifique. Toute nouvelle méthode statistique a très rapidement une implémentation dans ce langage, ce qui n’est pas le cas pour d’autres langages.

Pour simplifier le développement de programme R, il est nécessaire d’avoir une interface graphique (appelée aussi GUI). Celle offerte par R est très simpliste et beaucoup préfèrent utiliser RStudio, à juste titre. Cet outil permet de réellement fluidifier le travail avec ce langage.

Enfin, R, dans l’esprit open source, offre la possibilité de charger des paquets (ou packages ou library) afin d’étendre ses possibilités. Il en existe un très grand nombre sur le site du CRAN, parfois redondants entre eux. Pour cette session, nous allons utiliser les paquets contenus dans tidyverse, qui est une collection de librairies très bien faites et adaptées pour la Data Science.

Voici quelques liens intéressants pour ce cours:

Eléments de langages

Nous allons voir ici les différentes structures de données utilisées dans R, ainsi que les moyens de les créer et de les manipuler.

Type vector

Tout est vector de base (au minimum), il n’existe pas de type scalaire. La fonction class() renvoie la classe de l’objet passé en paramètre. Les fonctionis.<type>() permet de tester si l’objet en paramètre est du type demandé.

a = 1
print(a)
## [1] 1
a
## [1] 1
class(a)
## [1] "numeric"
is.vector(a)
## [1] TRUE

Si nous créons le vecteur 1 2 3 4 5 (grâce à la commande 1:5), nous pouvons voir que les retours des fonctions class() et is.vector() sont les mêmes que pour la variable a ci-dessus.

1:5
## [1] 1 2 3 4 5
class(1:5)
## [1] "integer"
is.vector(1:5)
## [1] TRUE

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
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.177034603 0.066276668 0.005197017 0.049850591 0.730894205
##  [6] 0.561666068 0.992355754 0.809606194 0.331764860 0.703402273
rnorm(10)
##  [1] -0.12764181  1.58835228 -0.65595554  0.74007587 -0.08543956
##  [6] -0.14056128 -0.82378787  1.90407070  0.41394864  2.05506503
rnorm(10, 100, 20)
##  [1] 118.07500 105.11678  96.22467  96.97579 123.05000  68.66674 104.77468
##  [8]  99.09562 124.16610 153.13426

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 initiale. Les fonctions head() et tail() permettent d’avoir les premières ou les dernières valeurs (6 par défaut, modifiable si besoin).

x = rnorm(100)
x[1]
## [1] -1.066203
x[c(1, 5, 10)]
## [1] -1.0662029 -0.6287342 -0.8041143
x[x > 2]
## [1] 2.883829 2.103105 2.334615 2.183640
head(x)
## [1] -1.066202907  0.668619246 -2.327777838 -0.073573977 -0.628734217
## [6]  0.004495144
head(x, 10)
##  [1] -1.066202907  0.668619246 -2.327777838 -0.073573977 -0.628734217
##  [6]  0.004495144 -0.261151245 -0.245406002  1.486140814 -0.804114340
tail(x)
## [1]  1.74138223  0.09194747 -0.53366075  1.31649874 -1.45544828 -1.34583493
tail(x, 10)
##  [1]  0.81249326 -1.41490222  0.58829609 -1.64619650  1.74138223
##  [6]  0.09194747 -0.53366075  1.31649874 -1.45544828 -1.34583493

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"
## [12] "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"
## [12] "Dec"
## 
## $pi
## [1] 3.141593
c = list(1:5, mois = month.abb, pi = pi)
c[[1]]
## [1] 1 2 3 4 5
c[[2]]
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"
## [12] "Dec"
c$mois
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"
## [12] "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"
## [12] "Dec"
## 
## $d1$pi
## [1] 3.141593
## 
## 
## $d2
## [1] -1.066202907  0.668619246 -2.327777838 -0.073573977 -0.628734217
## [6]  0.004495144
d$d1
## [[1]]
## [1] 1 2 3 4 5
## 
## $mois
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"
## [12] "Dec"
## 
## $pi
## [1] 3.141593
d$d2
## [1] -1.066202907  0.668619246 -2.327777838 -0.073573977 -0.628734217
## [6]  0.004495144
d$d1$mois
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"
## [12] "Dec"

Type matrix (et array)

Si on souhaite créer des tableaux à 2 dimensions, 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.98738357 0.20305268 0.6918126 0.67603582 0.19818092
##  [2,] 0.90916959 0.30281010 0.3396540 0.35831115 0.29865382
##  [3,] 0.70774778 0.26814503 0.7050606 0.30193696 0.42405035
##  [4,] 0.39796039 0.10589999 0.3456480 0.44715391 0.21471862
##  [5,] 0.36755347 0.79273229 0.5382245 0.29242414 0.67011538
##  [6,] 0.55801965 0.52395863 0.8329023 0.07574047 0.64624253
##  [7,] 0.53637856 0.98201592 0.7895472 0.81998304 0.96697905
##  [8,] 0.65838520 0.73578558 0.9126702 0.27530233 0.56139100
##  [9,] 0.56242855 0.60720368 0.6138791 0.12151891 0.58916883
## [10,] 0.25329023 0.69890138 0.2349903 0.14730542 0.22557924
## [11,] 0.05568334 0.33467548 0.5761912 0.94839625 0.37981468
## [12,] 0.81517883 0.58552636 0.5511563 0.98632758 0.16734898
## [13,] 0.41527378 0.06367596 0.7585646 0.63899358 0.99785779
## [14,] 0.67972860 0.80347104 0.5136912 0.85705281 0.28841775
## [15,] 0.74929791 0.13142131 0.2361596 0.33379358 0.98278460
## [16,] 0.20416052 0.86507029 0.3111941 0.98376469 0.70784443
## [17,] 0.82534836 0.93708747 0.4275744 0.06672589 0.36637256
## [18,] 0.85105235 0.03646817 0.9189686 0.20156798 0.03681182
## [19,] 0.49309170 0.43471119 0.2148760 0.39777233 0.54091694
## [20,] 0.11569973 0.39989469 0.6915437 0.78916554 0.25827325
dim(m)
## [1] 20  5
head(m)
##           [,1]      [,2]      [,3]       [,4]      [,5]
## [1,] 0.9873836 0.2030527 0.6918126 0.67603582 0.1981809
## [2,] 0.9091696 0.3028101 0.3396540 0.35831115 0.2986538
## [3,] 0.7077478 0.2681450 0.7050606 0.30193696 0.4240504
## [4,] 0.3979604 0.1059000 0.3456480 0.44715391 0.2147186
## [5,] 0.3675535 0.7927323 0.5382245 0.29242414 0.6701154
## [6,] 0.5580196 0.5239586 0.8329023 0.07574047 0.6462425
m[1,]
## [1] 0.9873836 0.2030527 0.6918126 0.6760358 0.1981809
m[1:3,]
##           [,1]      [,2]      [,3]      [,4]      [,5]
## [1,] 0.9873836 0.2030527 0.6918126 0.6760358 0.1981809
## [2,] 0.9091696 0.3028101 0.3396540 0.3583111 0.2986538
## [3,] 0.7077478 0.2681450 0.7050606 0.3019370 0.4240504
m[,1]
##  [1] 0.98738357 0.90916959 0.70774778 0.39796039 0.36755347 0.55801965
##  [7] 0.53637856 0.65838520 0.56242855 0.25329023 0.05568334 0.81517883
## [13] 0.41527378 0.67972860 0.74929791 0.20416052 0.82534836 0.85105235
## [19] 0.49309170 0.11569973
m[,1:3]
##             [,1]       [,2]      [,3]
##  [1,] 0.98738357 0.20305268 0.6918126
##  [2,] 0.90916959 0.30281010 0.3396540
##  [3,] 0.70774778 0.26814503 0.7050606
##  [4,] 0.39796039 0.10589999 0.3456480
##  [5,] 0.36755347 0.79273229 0.5382245
##  [6,] 0.55801965 0.52395863 0.8329023
##  [7,] 0.53637856 0.98201592 0.7895472
##  [8,] 0.65838520 0.73578558 0.9126702
##  [9,] 0.56242855 0.60720368 0.6138791
## [10,] 0.25329023 0.69890138 0.2349903
## [11,] 0.05568334 0.33467548 0.5761912
## [12,] 0.81517883 0.58552636 0.5511563
## [13,] 0.41527378 0.06367596 0.7585646
## [14,] 0.67972860 0.80347104 0.5136912
## [15,] 0.74929791 0.13142131 0.2361596
## [16,] 0.20416052 0.86507029 0.3111941
## [17,] 0.82534836 0.93708747 0.4275744
## [18,] 0.85105235 0.03646817 0.9189686
## [19,] 0.49309170 0.43471119 0.2148760
## [20,] 0.11569973 0.39989469 0.6915437
m[1,1]
## [1] 0.9873836
m[1:3,1]
## [1] 0.9873836 0.9091696 0.7077478
m[1,1:3]
## [1] 0.9873836 0.2030527 0.6918126
m[1:3,1:3]
##           [,1]      [,2]      [,3]
## [1,] 0.9873836 0.2030527 0.6918126
## [2,] 0.9091696 0.3028101 0.3396540
## [3,] 0.7077478 0.2681450 0.7050606

Le type array est finalement une extension de matrix à plus de 2 dimensions. Nous ne verrons pas ce type pour le moment.

class(m)
## [1] "matrix"
is.array(m)
## [1] TRUE

Type 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
## [15] 10.4 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
## [29] 15.8 19.7 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
## [15] 10.4 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
## [29] 15.8 19.7 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
## [15] 10.4 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
## [29] 15.8 19.7 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
##  [36] 1 1 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
##  [71] 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 2 2 2 2 3 3 3 3 3
## [106] 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
## [141] 3 3 3 3 3 3 3 3 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

Dans l’univers tidyverse, c’est l’utilisation du type tibble qui est privilégié. Pour information, la fonction tibble() sert à transformer un objet dans cette classe, ou à en créer un nouveau (pas vu ici).

library(tibble)
mtt = as_tibble(mtcars)
mtt
## # A tibble: 32 x 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.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4
##  2  21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4
##  3  22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1
##  4  21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1
##  5  18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2
##  6  18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1
##  7  14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     4
##  8  24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2
##  9  22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2
## 10  19.2     6 167.6   123  3.92 3.440 18.30     1     0     4     4
## # ... with 22 more rows
class(mtt)
## [1] "tbl_df"     "tbl"        "data.frame"
head(mtt)
## # A tibble: 6 x 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.0     6   160   110  3.90 2.620 16.46     0     1     4     4
## 2  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
## 3  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
## 4  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1
## 5  18.7     8   360   175  3.15 3.440 17.02     0     0     3     2
## 6  18.1     6   225   105  2.76 3.460 20.22     1     0     3     1

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 : texte délimité, Excel et SAS. Les trois fonctions qu’on va utiliser renvoient un objet de type tibble.

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("../donnees/Iris.txt", delim = "\t")
## Parsed with column specification:
## cols(
##   `Sepal Length` = col_double(),
##   `Sepal Width` = col_double(),
##   `Petal Length` = col_double(),
##   `Petal Width` = col_double(),
##   Species = col_character()
## )
iris_txt
## # A tibble: 150 x 5
##    `Sepal Length` `Sepal Width` `Petal Length` `Petal Width` Species
##             <dbl>         <dbl>          <dbl>         <dbl>   <chr>
##  1            5.1           3.5            1.4           0.2  setosa
##  2            4.9           3.0            1.4           0.2  setosa
##  3            4.7           3.2            1.3           0.2  setosa
##  4            4.6           3.1            1.5           0.2  setosa
##  5            5.0           3.6            1.4           0.2  setosa
##  6            5.4           3.9            1.7           0.4  setosa
##  7            4.6           3.4            1.4           0.3  setosa
##  8            5.0           3.4            1.5           0.2  setosa
##  9            4.4           2.9            1.4           0.2  setosa
## 10            4.9           3.1            1.5           0.1  setosa
## # ... with 140 more rows

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("../donnees/Iris.xlsx")
iris_xlsx
## # A tibble: 150 x 5
##    `Sepal Length` `Sepal Width` `Petal Length` `Petal Width` Species
##             <dbl>         <dbl>          <dbl>         <dbl>   <chr>
##  1            5.1           3.5            1.4           0.2  setosa
##  2            4.9           3.0            1.4           0.2  setosa
##  3            4.7           3.2            1.3           0.2  setosa
##  4            4.6           3.1            1.5           0.2  setosa
##  5            5.0           3.6            1.4           0.2  setosa
##  6            5.4           3.9            1.7           0.4  setosa
##  7            4.6           3.4            1.4           0.3  setosa
##  8            5.0           3.4            1.5           0.2  setosa
##  9            4.4           2.9            1.4           0.2  setosa
## 10            4.9           3.1            1.5           0.1  setosa
## # ... with 140 more rows

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("../donnees/Iris.sas7bdat")
iris_sas
## # A tibble: 150 x 5
##    Sepal_Length Sepal_Width Petal_Length Petal_Width Species
##           <dbl>       <dbl>        <dbl>       <dbl>   <chr>
##  1          5.1         3.5          1.4         0.2  setosa
##  2          4.9         3.0          1.4         0.2  setosa
##  3          4.7         3.2          1.3         0.2  setosa
##  4          4.6         3.1          1.5         0.2  setosa
##  5          5.0         3.6          1.4         0.2  setosa
##  6          5.4         3.9          1.7         0.4  setosa
##  7          4.6         3.4          1.4         0.3  setosa
##  8          5.0         3.4          1.5         0.2  setosa
##  9          4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
## # ... with 140 more rows

Manipulation 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.

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.

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

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
## 1 32.4   4 78.7  66 4.08 2.200 19.47  1  1    4    1
## 2 30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
## 3 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1
## 4 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
## 1 30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
## 2 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
## 1  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
## 1 30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
## 2 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)
## # A tibble: 5 x 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.0     6   160   110  3.90 2.620 16.46     0     1     4     4
## 2  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
## 3  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
## 4  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1
## 5  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
## # A tibble: 8 x 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  19.2     8 400.0   175  3.08 3.845 17.05     0     0     3     2
## 2  27.3     4  79.0    66  4.08 1.935 18.90     1     1     4     1
## 3  26.0     4 120.3    91  4.43 2.140 16.70     0     1     5     2
## 4  30.4     4  95.1   113  3.77 1.513 16.90     1     1     5     2
## 5  15.8     8 351.0   264  4.22 3.170 14.50     0     1     5     4
## 6  19.7     6 145.0   175  3.62 2.770 15.50     0     1     5     6
## 7  15.0     8 301.0   335  3.54 3.570 14.60     0     1     5     8
## 8  21.4     4 121.0   109  4.11 2.780 18.60     1     1     4     2
mtcars %>% slice(seq(1, n(), by = 4))
## # A tibble: 8 x 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.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4
## 2  18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2
## 3  22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2
## 4  17.3     8 275.8   180  3.07 3.730 17.60     0     0     3     3
## 5  14.7     8 440.0   230  3.23 5.345 17.42     0     0     3     4
## 6  21.5     4 120.1    97  3.70 2.465 20.01     1     0     3     1
## 7  19.2     8 400.0   175  3.08 3.845 17.05     0     0     3     2
## 8  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

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
## 1 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
## 2 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 3 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 4 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 5 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 6 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
## 1 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
## 2 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 5 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 6 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
## 1 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## 2 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 3 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 4 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 6 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
## 1 21.0   6  160 3.90 16.46  0  1    4    4 0.02381818    0
## 2 21.0   6  160 3.90 17.02  0  1    4    4 0.02613636    0
## 3 22.8   4  108 3.85 18.61  1  1    4    1 0.02494624    0
## 4 21.4   6  258 3.08 19.44  1  0    3    1 0.02922727    0
## 5 18.7   8  360 3.15 17.02  0  0    3    2 0.01965714    0
## 6 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
## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 1        3
## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 2        3
## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 3        1
## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 4        2
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 5        5
## 6 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
## 1 0.02381818
## 2 0.02613636
## 3 0.02494624
## 4 0.02922727
## 5 0.01965714
## 6 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 x 4
##     cyl     n mpg_mean nbtype_carb
##   <dbl> <int>    <dbl>       <int>
## 1     4    11 26.66364           2
## 2     6     7 19.74286           3
## 3     8    14 15.10000           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, 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, 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, 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.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   medium
## 5  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4   medium
## 6  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4   medium
## 7  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6   medium
## 8  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2      big
## 9  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4      big
## 10 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3      big
## 11 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3      big
## 12 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3      big
## 13 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4      big
## 14 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4      big
## 15 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4      big
## 16 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2      big
## 17 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2      big
## 18 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4      big
## 19 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2      big
## 20 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4      big
## 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, 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, by = "cyl"
##     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## 3  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## 4  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## 5  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## 6  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## 7  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## 8  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## 9  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## 10 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## 11 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## 12 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## 13 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## 14 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## 15 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## 16 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## 17 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## 18 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## 19 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## 20 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## 21 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
mtcars %>% anti_join(engine)
## Joining, by = "cyl"
##     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## 1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## 2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## 3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## 4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## 5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## 6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## 7  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## 8  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## 9  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## 10 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## 11 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

A Faire

La base de données Gymnase2000 contient les informations d’un (petit) club de sport. Elle contient les tables suivantes (au format SAS ici) :

Schéma de Gymnase2000

Schéma de Gymnase2000

Vous devez d’abord importer les données dans R, puis répondre aux demandes suivantes :

  1. Joueurs de moins de 30 ans
  2. Gymnases d’au moins 500 \(m^2\)
  3. Gymnases avec des séances le mercredi
  4. Sports joués par les moins de 30 ans
  5. Sports avec séances de l’entraineur “BOUTAHAR”
  6. Gymnases avec des séances de “Hand ball”
  7. Sportifs artbitre et entraineur du même sport
  8. Par ville, nombre et surface moyenne des gymnases
  9. Quels sports sont pratiqués à “Stains” ?
  10. Quelle est le nombre et la surface moyenne des gymnases ?
  11. Idem, en détaillant pour chaque ville.
  12. Avec ces deux requêtes, faire une seule table résultat où le global sera indiqué avec le terme “Total”, en lieu et place de la ville.
  13. Quelle est la moyenne d’âge des arbitres pour chaque sport, trié par ordre décroissant de la moyenne d’âge ?
  14. Dans quels gymnases peut-on jouer au hockey le mercredi après 15H ?
  15. Quels sportifs (Identifiant et nom) ne jouent aucun sport ?
  16. Quels gymnases n’ont pas de séances le dimanche ?
  17. Quels gymnases ne proposent que des séances de basket-ball ou de volley-ball?
  18. Quels sont les gymnases de “Stains” ou de “Montmorency” qui ont la plus grande surface?
  19. Quels entraineurs n’entrainent que du hand-ball ou du basket-ball (ou les deux) ?
  20. Quelle est la liste des conseillers des joueurs de basket-ball ?
  21. Pour chaque gymnase de “Stains” donner par jour d’ouverture les horaires des premières et dernières séances
  22. Quels sont les gymnases ayant strictement plus de 1 séance le mercredi ?
  23. Dans quels gymnases et quels jours y a-t-il au moins 4 séances de volley-ball (dans la journée) ?

Questions subsidiaires :

  1. Sportifs (id, nom, prenom) avec 3 indicateurs : le nombre de sports qu’ils jouent (table Jouer), le nombre de sports qu’ils entraînent (table Entrainer), et le nombre de sports qu’ils arbitrent (table Arbitrer) ;
  2. Gymnases (id, nom, ville) avec, pour chaque jour de la semaine (un jour = une colonne du tableau résultat), le nombre de séances prévues.