Dans ce document sont présentés les concepts principaux du logiciel R (éléments de langage, données manipulées, manipulation de données, …).

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 = 5
print(a)
## [1] 5
a
## [1] 5
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
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.66481339 0.80861671 0.71600579 0.76952450 0.04398933 0.03274254
##  [7] 0.63574938 0.34861258 0.58801412 0.72162353
rnorm(10)
##  [1] -0.4775197  0.7891294  0.5968639 -0.1628003  0.5901174  0.1009003
##  [7]  0.3189637  0.7379933 -0.9104978  0.3424992
rnorm(10, 100, 20)
##  [1] 103.62609  92.01479 119.44532  78.33478  69.01303 107.30622  71.00389
##  [8]  77.18775  87.07230  80.46943

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.839893
x[c(1, 5, 10)]
## [1] -0.839893  1.270473  1.369900
x[x > 2]
## [1] 2.072069
head(x)
## [1] -0.839893019  0.688676746 -0.009236072  0.097481922  1.270472531
## [6] -0.528281552
head(x, 10)
##  [1] -0.839893019  0.688676746 -0.009236072  0.097481922  1.270472531
##  [6] -0.528281552 -1.707517806 -1.561841940  1.933006589  1.369899989
tail(x)
## [1] -0.89715600 -0.29132085 -0.06917873 -0.51858286 -0.28562293  0.09251259
tail(x, 10)
##  [1]  0.50377031 -0.49328880 -0.09438546  1.11530841 -0.89715600
##  [6] -0.29132085 -0.06917873 -0.51858286 -0.28562293  0.09251259

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
## 
## $mois
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"
## [12] "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"
## [12] "Dec"
c[["mois"]]
##  [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] -0.839893019  0.688676746 -0.009236072  0.097481922  1.270472531
## [6] -0.528281552
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] -0.839893019  0.688676746 -0.009236072  0.097481922  1.270472531
## [6] -0.528281552
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.68492965 0.22549854 0.12819792 0.0971293228 0.83793413
##  [2,] 0.03771571 0.13593114 0.95981533 0.0001767897 0.71802423
##  [3,] 0.10093451 0.86403293 0.47073248 0.9248447418 0.83357114
##  [4,] 0.60813565 0.39482380 0.80777998 0.5951175943 0.04183325
##  [5,] 0.36119904 0.05278694 0.68319301 0.2271869949 0.26775187
##  [6,] 0.32127243 0.74821578 0.25657952 0.9587218398 0.27140433
##  [7,] 0.39164240 0.82682431 0.41774968 0.9863370329 0.84548645
##  [8,] 0.82721396 0.89927224 0.13081325 0.5944384851 0.58068489
##  [9,] 0.56526340 0.44350110 0.43152284 0.7064293586 0.94738002
## [10,] 0.57589197 0.66037470 0.64030160 0.7523365433 0.90513446
## [11,] 0.81714173 0.29361891 0.56336861 0.0045104749 0.68243206
## [12,] 0.47832596 0.63373843 0.06742498 0.6431043255 0.09410051
## [13,] 0.95907826 0.84133629 0.41378538 0.0247770650 0.43514345
## [14,] 0.93604617 0.49601009 0.84976276 0.5417222241 0.74552088
## [15,] 0.18477702 0.94575838 0.22491536 0.6731198453 0.54803822
## [16,] 0.44345406 0.70812605 0.17148759 0.2787989757 0.25679607
## [17,] 0.51253583 0.90298241 0.94347724 0.8944999506 0.41174127
## [18,] 0.53619566 0.98528762 0.91683304 0.8935167047 0.52004397
## [19,] 0.49516446 0.19421339 0.99880562 0.5167045793 0.16692791
## [20,] 0.93049659 0.33857917 0.57024912 0.7402339422 0.59067886
dim(m)
## [1] 20  5
head(m)
##            [,1]       [,2]      [,3]         [,4]       [,5]
## [1,] 0.68492965 0.22549854 0.1281979 0.0971293228 0.83793413
## [2,] 0.03771571 0.13593114 0.9598153 0.0001767897 0.71802423
## [3,] 0.10093451 0.86403293 0.4707325 0.9248447418 0.83357114
## [4,] 0.60813565 0.39482380 0.8077800 0.5951175943 0.04183325
## [5,] 0.36119904 0.05278694 0.6831930 0.2271869949 0.26775187
## [6,] 0.32127243 0.74821578 0.2565795 0.9587218398 0.27140433
m[1,]
## [1] 0.68492965 0.22549854 0.12819792 0.09712932 0.83793413
m[1:3,]
##            [,1]      [,2]      [,3]         [,4]      [,5]
## [1,] 0.68492965 0.2254985 0.1281979 0.0971293228 0.8379341
## [2,] 0.03771571 0.1359311 0.9598153 0.0001767897 0.7180242
## [3,] 0.10093451 0.8640329 0.4707325 0.9248447418 0.8335711
m[,1]
##  [1] 0.68492965 0.03771571 0.10093451 0.60813565 0.36119904 0.32127243
##  [7] 0.39164240 0.82721396 0.56526340 0.57589197 0.81714173 0.47832596
## [13] 0.95907826 0.93604617 0.18477702 0.44345406 0.51253583 0.53619566
## [19] 0.49516446 0.93049659
m[,1:3]
##             [,1]       [,2]       [,3]
##  [1,] 0.68492965 0.22549854 0.12819792
##  [2,] 0.03771571 0.13593114 0.95981533
##  [3,] 0.10093451 0.86403293 0.47073248
##  [4,] 0.60813565 0.39482380 0.80777998
##  [5,] 0.36119904 0.05278694 0.68319301
##  [6,] 0.32127243 0.74821578 0.25657952
##  [7,] 0.39164240 0.82682431 0.41774968
##  [8,] 0.82721396 0.89927224 0.13081325
##  [9,] 0.56526340 0.44350110 0.43152284
## [10,] 0.57589197 0.66037470 0.64030160
## [11,] 0.81714173 0.29361891 0.56336861
## [12,] 0.47832596 0.63373843 0.06742498
## [13,] 0.95907826 0.84133629 0.41378538
## [14,] 0.93604617 0.49601009 0.84976276
## [15,] 0.18477702 0.94575838 0.22491536
## [16,] 0.44345406 0.70812605 0.17148759
## [17,] 0.51253583 0.90298241 0.94347724
## [18,] 0.53619566 0.98528762 0.91683304
## [19,] 0.49516446 0.19421339 0.99880562
## [20,] 0.93049659 0.33857917 0.57024912
m[1,1]
## [1] 0.6849296
m[1:3,1]
## [1] 0.68492965 0.03771571 0.10093451
m[1,1:3]
## [1] 0.6849296 0.2254985 0.1281979
m[1:3,1:3]
##            [,1]      [,2]      [,3]
## [1,] 0.68492965 0.2254985 0.1281979
## [2,] 0.03771571 0.1359311 0.9598153
## [3,] 0.10093451 0.8640329 0.4707325

Le type array est 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("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("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("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

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
## 1   6
## 2   4
## 3   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
## 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

Sinon, du SQL sur les data.frame

La librairie sqldf permet d’exécuter des requêtes SQL directement sur les data.frame présents dans R. Voici un exemple simple :

library(sqldf)
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
sqldf("
SELECT cyl, AVG(mpg), AVG(disp), AVG(hp), AVG(drat), AVG(wt), AVG(qsec)
  FROM mtcars
  GROUP BY cyl;
      ")
##   cyl AVG(mpg) AVG(disp)   AVG(hp) AVG(drat)  AVG(wt) AVG(qsec)
## 1   4 26.66364  105.1364  82.63636  4.070909 2.285727  19.13727
## 2   6 19.74286  183.3143 122.28571  3.585714 3.117143  17.97714
## 3   8 15.10000  353.1000 209.21429  3.229286 3.999214  16.77214

Document R markdown

Un document R markdown (généralement enregistré avec l’extension .rmd ou .Rmd) permet d’une part d’utiliser la syntaxe markdown pour écrire du texte, mais aussi d’inclure des commandes R directement dans le document. Ainsi, un seul document contient le code et le commentaire, ce qui est un atout non négligeable pour des rapports ou présentations devant être mises à jour ou refaits régulièrement.

Il est possible d’inclure les commandes R soit dans un bloc de code, appelé chunk dans R Studio, ou en ligne, appelé inline chunk.

Pour créer un document R markdown dans R Studio, vous pouvez cliquer sur l’icône avec un plus, puis sur R markdown…. Vous devez voir apparaître une interface vous demandant de choisir entre un document, une présentation, une application Shiny ou de choisir un template prédéfini. Nous allons rester sur le document pour le moment. De plus, vous pouvez indiquer le titre et l’auteur, ainsi que choisir le format de sortie (HTML, PDF ou Word). Nous allons garder HTML pour le moment.

En-tête

Lors de la création d’un nouveau document R markdown, vous devez voir apparaître en début de document une partie d’en-tête, comme ci-dessous, au format YAML.

---
title: "Untitled"
author: "FX Jollois"
date: "17/10/2016"
output: html_document
---

Dans cette en-tête, nous pouvons donc définir le titre, éventuellement un sous-titre (avec subtitle:), le ou les auteurs, la date et des options de sortie. Pour le moment, nous allons garder la sortie au format HTML. Pour passer au format PDF, il faut écrire pdf_document dans output (ainsi qu’avoir \(\LaTeX\) installé sur sa machine - ce qui n’est pas le cas à l’IUT). Pour créer un document de type Word, il faut choisir word_document pour output.

Il y a d’autres possibilités de sortie, ainsi que la possibilité d’ajouter d’autres paramètres de sortie, que nous ne verrons pas ici.

Chunk

Un chunk sera donc un bloc de commande R (ou autre langage possible) qui sera exécuté par R Studio. Pour cela, il faut indiquer sur la première ligne le langage utilisé. Pour R, voici donc un exemple simple

```{r}
# code R
summary(iris)
```

Dans le document sera donc intégré à la fois le code, ainsi que le résultat de son exécution. L’exemple donnera donc

# code R
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Il est possible de nommer le chunk en lui donnant un label (sans espace, sans accent) après r dans les {}. Ceci est intéressant surtout dans l’étape de développement, car si une erreur arrive lors de l’exécution, il sera plus facile de retrouver dans quel chunk est l’erreur (indiqué lors de l’affichage de l’erreur).

De plus, il est possible de mettre des options dans le chunk, toujours dans les {}, après une ",". Voici quelques options classiques et utiles (avec leur valeur par défaut indiquée, si elle existe) :

  • include = TRUE : si FALSE, le code est exécuté mais il n’est pas inclus dans le document (ni le code, ni son résultat)
  • echo = TRUE : si FALSE, le code n’est pas affiché mais bien exécuté
  • eval = TRUE : si FALSE, le code est affiché mais n’est pas exécuté
  • results = 'markup' : permet de définir comment le résultat est affiché (intéressant pour les tableaux, cf plus loin)
  • fig.cap : titre du graphique produit

Il est possible de mettre plusieurs options, toutes séparées par des ",".

Quelques exemples

Dans la suite, voici quelques exemples de chunks avec options. Regardez le source pour mieux comprendre le fonctionnement.

Tout d’abord, on importe les données heart.txt, mais ce genre de code n’est souvent pas à inclure, dans le sens où l’on ne veut ni l’afficher, ni voir de résultat.

Ensuite, la librairie knitr contient une fonction kable() permettant d’afficher un data.frame au format markdown. Cela permet d’avoir un résultat plus lisible qu’une sortie de console R classique.

knitr::kable(head(heart))
“Sepal Length” “Sepal Width” “Petal Length" “Pe tal Width" “Species”
5.1 3.5 1.4 0.2 setosa NA NA
4.9 3 1.4 0.2 setosa NA NA
4.7 3.2 1.3 0.2 setosa NA NA
4.6 3.1 1.5 0.2 setosa NA NA
5 3.6 1.4 0.2 setosa NA NA
5.4 3.9 1.7 0.4 setosa NA NA

Enfin, on peut vouloir faire un graphique, ce qui pourrait donner ce qui suit. Pour ce genre de présentation, nous pouvons décider de ne pas afficher le code permettant de les obtenir.

Répartition du sexe des individus selon le problème cardiaque

Répartition du sexe des individus selon le problème cardiaque

Inline chunk

On peut faire des chunks en ligne en encadrant le code avec des ` et en commencant le code par un r. Par exemple, on peut dire que dans le jeu de données heart sont présentés 150 individus et 3 variables.

Paramètres globaux des chunks

Il est possible de déterminer des paramètres globaux pour tous les blocs chunks du document (sauf paramètres locaux précisés). Ceci doit se faire comme suit, avec la fonction set() de l’objet opts_chunk de la librairie knitr. Il est par exemple possible de définir echo=FALSE pour n’avoir aucun code apparaissant dans le document.

knitr::opts_chunk$set(...)

A faire

Dans votre document, penser à nommer chaque chunk différement. Et n’hésiter pas à commenter le document pour le rendre plus conforme à ce qu’on pourrait vouloir produire comme document.

Vous trouverez sur le site rmarkdown beaucoup d’informations et de compléments sur cette librairie. Beaucoup sont résumées dans ce document.

  1. Créer un nouveau document R markdown, intitulé "TP", avec votre nom comme auteur
  2. Sauvegarder ce document sous le nom "TP.Rmd"
  3. Cliquer sur le bouton knit pour voir le résultat de l’exemple fourni
  4. Supprimer le contenu du document, en gardant uniquement l’en-tête
  5. Paramétrer l’ensemble des chunks pour ne pas voir apparaître le code des chunks dans le résultat
  6. Créer 4 titres de niveau 2, avec le contenu suivant
    1. Données :
    2. Consommation
      • Histogramme de la consommation (variable mpg, fonction hist())
      • Boîte à moustache de la même variable (fonction boxplot())
    3. Transmission :
      • créer une nouvelle variable trans dans le jeu de données mtcars prenant comme valeur "automatic" pour am == 0 et "manual" pour am == 1, en affichant le code pour la créer
      • afficher un tableau à deux colonnes :
        • "Transmission" avec les deux modalités de trans
        • "Effectif" avec l’effectif pour chaque transmission
      • afficher le diagramme circulaire de la répartition des voitures en fonction de leur transmission avec les paramètres suivants (fonction pie() et fonction table()) :
        • un titre de figure indiquant ce qui est représenté (cf fig.cap)
        • centrage dans le document (cf fig.align)
        • largeur et hauteur de 2.5(cf fig.width et fig.height)
        • la couleur "orange" pour "automatic" et "blue" pour "manual" (option color de la fonction pie())
    4. Consommation et transmission : trois sous-parties (avec des titres de niveau 3 à mettre)
      • Sous-tables : Faire deux sous-tables, une pour "automatic", l’autre pour "manual"
      • Automatique : représenter l’histogramme et la boîte à moustaches de la consommation pour les voitures à transmission automatique
      • Manuel : faire de même pour les voitures à transmission manuelle