R
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, …).
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:
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.
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
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"
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
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
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
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
.
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
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
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
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
Ici, les deux opérations consistent respectivement à sélectionner des lignes (restriction) ou des colonnes (projection).
mtcars %>% filter(mpg > 30)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 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
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
head(mtcars) %>% select(mpg)
## mpg
## Mazda RX4 21.0
## Mazda RX4 Wag 21.0
## Datsun 710 22.8
## Hornet 4 Drive 21.4
## Hornet Sportabout 18.7
## Valiant 18.1
head(mtcars) %>% select(qsec, mpg, hp)
## qsec mpg hp
## Mazda RX4 16.46 21.0 110
## Mazda RX4 Wag 17.02 21.0 110
## Datsun 710 18.61 22.8 93
## Hornet 4 Drive 19.44 21.4 110
## Hornet Sportabout 17.02 18.7 175
## Valiant 20.22 18.1 105
head(mtcars) %>% select(5, 3, 9)
## drat disp am
## Mazda RX4 3.90 160 1
## Mazda RX4 Wag 3.90 160 1
## Datsun 710 3.85 108 1
## Hornet 4 Drive 3.08 258 0
## Hornet Sportabout 3.15 360 0
## Valiant 2.76 225 0
head(mtcars) %>% select(starts_with("c")) # d'autres possibilités de ce type existent (voir ?select_helpers)
## cyl carb
## Mazda RX4 6 4
## Mazda RX4 Wag 6 4
## Datsun 710 4 1
## Hornet 4 Drive 6 1
## Hornet Sportabout 8 2
## Valiant 6 1
head(mtcars) %>% select(cyl)
## cyl
## Mazda RX4 6
## Mazda RX4 Wag 6
## Datsun 710 4
## Hornet 4 Drive 6
## Hornet Sportabout 8
## Valiant 6
head(mtcars) %>% select(cyl) %>% distinct()
## cyl
## 1 6
## 2 4
## 3 8
La fonction arrange()
permet le tri sur une ou plusieurs variables, avec desc()
pour indiquer un ordre décroissant.
head(mtcars) %>% arrange(mpg)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 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
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
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
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
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
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.
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.
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 produitIl est possible de mettre plusieurs options, toutes séparées par des ","
.
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.
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.
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(...)
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.
R markdown
, intitulé "TP"
, avec votre nom comme auteur"TP.Rmd"
mtcars
, et incluant un lien vers la pagede présentation https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/mtcars.htmlmpg
, fonction hist()
)boxplot()
)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"Transmission"
avec les deux modalités de trans
"Effectif"
avec l’effectif pour chaque transmissionpie()
et fonction table()
) :
fig.cap
)fig.align
)2.5
(cf fig.width
et fig.height
)"orange"
pour "automatic"
et "blue"
pour "manual"
(option color
de la fonction pie()
)"automatic"
, l’autre pour "manual"