You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Vérifier la compréhension des fonctions servant au remaniement des données avec les fonctions `select()`/`sselect()`, `filter()`/`sfilter()`, `mutate()`/`smutate()`, `group_by()`/`sgroup_by()`, `summarise()`/`ssummarise()`
37
+
Le cours de Science des données I : visualisation se divise en deux parties. La première partie traite principalement de la réalisation de graphiques et la seconde du remaniement des données. Ce tutoriel doit vous permettre de :
38
+
39
+
- Vérifier l'acquisition des notions relatives aux remaniement des données avec les fonctions `select()`/`sselect()`, `filter()`/`sfilter()`, `mutate()`/`smutate()`, `group_by()`/`sgroup_by()`, `summarise()`/`ssummarise()`
38
40
- Vérifier l'acquisition des compétences relatives au chaînage des instructions
39
41
40
-
## Calculer de nouvelles variables
42
+
## Les fonctions speedy/tidy
41
43
42
-
Le remaniement des données est indispensable lors d'une analyse. Pour vérifier l'acquisition de ces compétences, le jeu de données sur la mesure de deux espèces de crabes est employé.
44
+
L'instruction `SciViews::R` ou `SciViews::R()` qui est équivalente, est employée afin de charger une série cohérente de packages R. Nous l'utilisons en début de script R ou encore dans le premier chunk d'un rapport d'analyse au format R Markdown.
43
45
44
-
```{r}
45
-
SciViews::R
46
+
```{r, echo=TRUE, eval=FALSE}
47
+
SciViews::R()
48
+
```
49
+
50
+
Vous employez des tableaux de données depuis le premier module de ce cours afin de réaliser des graphiques. Vous allez à présent apprendre à les manipuler. Il existe dans R plusieurs types d'objets pour traiter les tableaux de données, dont **data.frame**, tibble (objet **tbl_df**) ou **data.table**. Par défaut dans `SciViews::R`, vous travaillez avec des objets de type **data.table**. La vitesse de traitements et la gestion en mémoire des objets **data.table** en font le choix idéal pour traiter des gros jeux de données. Actuellement, vous n'avez pas encore traité des gros jeux de données mais cela va venir plus vite que vous ne l'imaginez.
51
+
52
+
Le remaniement de données est tout un art que vous devez maîtriser. Vous devez être capable de sélectionner des colonnes, de filtrer des lignes, de trier un tableau, de résumer vos observations,...
53
+
54
+
Parmi les fonctions de remaniement de tableaux, nous avons les fonctions "speedy" élaborées dans le nouveau package {svBase} sur base de travail réalisé dans le package {collapse} qui vise à accélérer le traitement dans R. Ces fonctions speedy sont compatibles avec les objets **data.table**. Elles sont préfixées avec un "s" pour les reconnaître facilement.
55
+
56
+
```{r, echo=TRUE}
57
+
list_speedy_functions()
58
+
```
59
+
60
+
Un second ensemble est constitué des fonctions "tidy" du [Tidyverse](https://www.tidyverse.org), et portant le même nom que leurs homologues speedy, mais non préfixées d'un "s".
61
+
62
+
```{r, echo=TRUE}
63
+
list_tidy_functions()
64
+
```
65
+
66
+
Nous retrouvons donc des paires de fonctions tidy/speedy qui réalisent des traitements très similaires et ont une syntaxe identique ou très proche. Elles permettent de :
67
+
68
+
- sélectionner des colonnes d'un jeu de données avec `select()`/`sselect()`
69
+
- filtrer des lignes dans un jeu de données avec `filter()`/`sfilter()`
70
+
- calculer de nouvelles variables dans un jeu de données avec `mutate()`/`smutate()`
71
+
- indiquer les variables de regroupement à utiliser dans un tableau avec `group_by()`/`sgroup_by()`
72
+
- résumer les variables d'un jeu de données avec `summarise()`/`ssummarise()`
73
+
74
+
*Nous vous conseillons d'employer préférentiellement les fonctions speedy.* Vous trouverez un exemple d'instructions ci-dessous équivalentes et écrite d'abord sous forme speedy, et ensuite sous forme tidy.
75
+
76
+
```{r, echo=TRUE, eval=FALSE}
77
+
# Assignation classique avec fonctions "speedy" => version conseillée
78
+
crabs1 <- sselect(crabs, species, sex, length)
79
+
# Assignation alternative avec fonctions "tidy"
80
+
crabs1 %<-% select(crabs, species, sex, length)
81
+
```
82
+
83
+
Si vous analysez ces instructions, il y a un élément qui doit vous sauter aux yeux. On peut observer une assignation particulière avec les fonctions tidy dans `SciViews::R`. En effet, il faut prendre soin de **collecter** les résultats à la fin si l'on travaille avec des objets de classe **data.table**. C'est le package {dtplyr} qui gère les calculs en interne. Utilisez l'assignation alternative `%<-%` ou `%->%`, ou alors, explicitement la fonction `collect_dtx()` pour récupérer un tableau utilisable ensuite avec les fonctions non-tidy. Par contre, une suite de fonctions tidy ne nécessite pas de collecter le tableau entre leurs appels.
84
+
85
+
```{r, echo=TRUE, eval=FALSE}
86
+
# Assignation alternative avec fonctions "tidy"
87
+
crabs1 %<-% select(crabs, species, sex, length)
88
+
# Assignation classique avec collect_dtx() (plus lourd)
89
+
crabs1 <- collect_dtx(select(crabs, species, sex , length))
90
+
# Assignation classique avec collect_dtx() et le pipe natif de R (plus lourd)
Le tableau de données que vous allez employer porte sur deux variétés de crabes.
97
+
98
+
```{r, echo = TRUE}
99
+
SciViews::R(lang = "fr")
46
100
# Importation des données crabs
47
-
(crabs <- read("crabs", package = "MASS", lang = "fr"))
101
+
(crabs <- read("crabs", package = "MASS"))
48
102
```
49
103
50
-
À partir du jeu de données `crabs`, calculez à l'aide de la fonction speedy `smutate()` :
104
+
Ce tableau contient `r nrow(crabs)` observations et `r ncol(crabs)` variables. Les carapaces d'individus mâles et femelles de deux variétés de crabes ont été mesurées sous toutes les coutures.
105
+
106
+
### Calculer de nouvelles variables
107
+
108
+
Calculez sur le tableau `crabs` à l'aide de la fonction speedy `smutate()` :
51
109
52
110
- le logarithme (`log()`) de la longueur de la carapace (`length`) des crabes et nommez cette nouvelle variables **length_log**
53
111
- la racine carrée (`sqrt()`) de la largueur de la carapace (`width`) et nommez cette nouvelle variable **width_sqrt**
@@ -107,7 +165,7 @@ head(crabs)
107
165
grade_code("Vous savez maintenant comment calculer de nouvelles variables avec la fonction `smutate()`.")
108
166
```
109
167
110
-
## Filtrer et sélectionner des données
168
+
###Filtrer et sélectionner des données
111
169
112
170
Reprenons le jeu de données initial sur nos crabes (`crabs`).
113
171
@@ -116,7 +174,7 @@ Reprenons le jeu de données initial sur nos crabes (`crabs`).
116
174
(crabs <- read("crabs", package = "MASS", lang = "fr"))
117
175
```
118
176
119
-
Réalisez les opérations suivantes avec les fonctions tidy `filter()` et `select()` :
177
+
Réalisez les opérations suivantes avec les fonctions tidy `filter()` et `select()`sur le tableau `crabs` et assignez votre résultat à `crabs2`:
120
178
121
179
- Retirer la variable index (`index`) du jeu de données
122
180
- Garder uniquement les individus mâles du jeu de données dont la longueur de la carapace est supérieure ou égale à 25 mm (variables `sex` et `length`)
@@ -130,6 +188,7 @@ crabs %>.%
130
188
select(., -index) %>.%
131
189
filter(., sex == "M" & length >= 25) %->%
132
190
crabs2
191
+
# Visualisation des six premières lignes du tableau
133
192
head(crabs2)
134
193
```
135
194
@@ -172,16 +231,42 @@ head(crabs2)
172
231
grade_code("La sélection de vos variables avec `select()` et de vos observations avec `filter()` (fonctions tidy) nécessite de collecter le résultat soit avec collect_dtx(), soit en utilisant l'assignation alternative %<-% ou %->% . En général dans un pipeline, finnissez toujours en assignant avec %->%, quelles que soient les fonctions utilisées.")
173
232
```
174
233
175
-
## Résumer des données
234
+
Afin de comparer les fonctions speedy et tidy, réalisez le même exercice en utilisant des fonctions "speedy".
176
235
177
-
Reprenons le jeu de données initial `crabs`.
236
+
```{r pipe1s_h2, exercise=TRUE}
237
+
crabs ___
238
+
___(___, ___) ___
239
+
___(___, ___ & ___) %->%
240
+
crabs2
241
+
head(crabs2)
242
+
```
178
243
179
-
```{r}
180
-
# Importation des données sur les crabes
181
-
(crabs <- read("crabs", package = "MASS", lang = "fr"))
244
+
```{r pipe1s_h2-hint-1}
245
+
crabs %>.%
246
+
sselect(___, ___) ___
247
+
___(___, ___ & ___) %->%
248
+
crabs2
249
+
head(crabs2)
250
+
251
+
#### Attention : solution dans le 'hint' suivant! ####
252
+
```
253
+
254
+
```{r pipe1s_h2-solution}
255
+
## Solution ##
256
+
crabs %>.%
257
+
sselect(., -index) %>.%
258
+
sfilter(., sex == "M" & length >= 25) %->%
259
+
crabs2
260
+
head(crabs2)
261
+
```
262
+
263
+
```{r pipe1s_h2-check}
264
+
grade_code("Vous voyez que les fonctions `select()` et `sselect()`, ainsi que `filter()` et `sfilter()` sont quasi-interchageables. Les résultats ne sont cependant pas toujours similaires et vous devez toujours bien vous rappeler de collecter les résultats avec les fonctions tidy (`collect_dtx()`, `%<-%` ou `%->%`).")
182
265
```
183
266
184
-
Réalisez les opérations suivantes :
267
+
### Résumer des données
268
+
269
+
Réalisez les opérations suivantes sur `crabs` :
185
270
186
271
- Sélectionnez les individus dont la longueur (`length`) est strictement supérieur à 25 mm
187
272
- Résumez le jeu de données par le sexe (`sex`) et par la variété (`species`) de ce crabe dans cet ordre
@@ -212,7 +297,8 @@ crabs ___
212
297
number = ___(___),
213
298
observations = ___(___)) ___
214
299
___
215
-
___(___)
300
+
# Tableau formaté avec knitr::kable()
301
+
___(___)
216
302
```
217
303
218
304
```{r pipe2_h3-hint-1}
@@ -223,7 +309,8 @@ crabs %>.%
223
309
number = ___(___),
224
310
observations = ___(___)) ___
225
311
___
226
-
kintr::kable(___)
312
+
# Tableau formaté avec knitr::kable()
313
+
knitr::kable(___)
227
314
```
228
315
229
316
```{r pipe2_h3-hint-2}
@@ -234,6 +321,7 @@ crabs %>.%
234
321
number = fn(___),
235
322
observations = fnobs(___)) ___
236
323
___
324
+
# Tableau formaté avec knitr::kable()
237
325
knitr::kable(___)
238
326
239
327
#### Attention : solution dans le 'hint' suivant! ####
@@ -248,13 +336,87 @@ crabs %>.%
248
336
number = fn(width),
249
337
observations = fnobs(width)) %->%
250
338
crabs2
339
+
# Tableau formaté avec knitr::kable()
251
340
knitr::kable(crabs2)
252
341
```
253
342
254
343
```{r pipe2_h3-check}
255
344
grade_code("Vous avez maintenant compris comment résumer vos données avec `(s)group_by()` et `(s)summarise()` et formater vos sorties avec `knitr::kable()`. Utilisez toujours l'assignation alternative `%->%` en fin de pipeline, c'est plus prudent.")
256
345
```
257
346
347
+
Réalisez à présent un exercice similaire avec les fonctions speedy :
348
+
349
+
- Sélectionnez les individus dont la longueur (`length`) est strictement *inférieur ou égale* à 25 mm
350
+
- Résumez le jeu de données par le sexe (`sex`) et par la variété (`species`) de crabe
351
+
- Calculez la médiane de la largeur des carapaces (`width`) par groupe avec la fonction `fmedian()`
352
+
- Dénombrez les individus par groupe avec la fonction `fn()`
353
+
- Assignez le résultat à `crabs2`. Utilisez l'assignation adéquate.
354
+
- Formatez votre tableau `crabs2` avec la fonction `knitr::kable()`
355
+
356
+
Employez le chaînage des opérations au sein d'un pipeline pour résoudre cette exercice. Vous devez obtenir le tableau ci-dessous :
357
+
358
+
```{r}
359
+
crabs %>.%
360
+
sfilter(., length <= 25) %>.%
361
+
sgroup_by(., sex, species) |> ssummarise(
362
+
mean = fmedian(width),
363
+
number = fn(width)) ->
364
+
crabs2
365
+
# Tableau formaté avec knitr::kable()
366
+
knitr::kable(crabs2)
367
+
```
368
+
369
+
```{r pipe3_h3, exercise=TRUE}
370
+
crabs ___
371
+
___(___, ___) ___
372
+
___(___, ___, ___) ___ ___
373
+
median = ___(___),
374
+
number = ___(___)) ___
375
+
___
376
+
# Tableau formaté avec knitr::kable()
377
+
___(___)
378
+
```
379
+
380
+
```{r pipe3_h3-hint-1}
381
+
crabs %>.%
382
+
sfilter(___, ___) ___
383
+
sgroup_by(___, ___, ___) ___ ssummarise(
384
+
median = ___(___),
385
+
number = ___(___)) ___
386
+
___
387
+
# Tableau formaté avec knitr::kable()
388
+
knitr::kable(___)
389
+
```
390
+
391
+
```{r pipe3_h3-hint-2}
392
+
crabs %>.%
393
+
sfilter(., length <= ___) %>.%
394
+
sgroup_by(., ___, ___) |> ssummarise(
395
+
median = mean(___),
396
+
number = fn(___)) ___
397
+
___
398
+
# Tableau formaté avec knitr::kable()
399
+
knitr::kable(___)
400
+
401
+
#### Attention : solution dans le 'hint' suivant! ####
402
+
```
403
+
404
+
```{r pipe3_h3-solution}
405
+
## Solution ##
406
+
crabs %>.%
407
+
sfilter(., length <= 25) %>.%
408
+
sgroup_by(., sex, species) |> ssummarise(
409
+
median = fmedian(width),
410
+
number = fn(width)) %->%
411
+
crabs2
412
+
# Tableau formaté avec knitr::kable()
413
+
knitr::kable(crabs2)
414
+
```
415
+
416
+
```{r pipe3_h3-check}
417
+
grade_code("Vous savez maintenant résumer vos données avec `sgroup_by()` et `ssummarise()`. Vous avez bien assimilé la différence entre les fonctions speedy et tidy.")
418
+
```
419
+
258
420
## Conclusion
259
421
260
422
Bravo ! Vous venez de terminer votre séance d'exercices relative à la manipulation des données.
0 commit comments