Skip to content

Commit d78f96e

Browse files
committed
Conflict resolved
Merge branch 'master' of github.com:BioDataScience-Course/BioDataScience1 # Conflicts: # inst/tutorials/A05La_wrangling/A05La_wrangling.Rmd
2 parents 2bccf6b + 5aa891a commit d78f96e

File tree

4 files changed

+1244
-21
lines changed

4 files changed

+1244
-21
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: BioDataScience1
2-
Version: 2022.3.0
2+
Version: 2022.3.1
33
Title: A Series of Learnr Documents for Biological Data Science 1
44
Description: Interactive documents using learnr and shiny applications for studying biological data science.
55
Authors@R: c(

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# BioDataScience1 2022.3.1
2+
3+
- Reworked version of **A05La_wrangling** with 5 exercises instead of 3.
4+
15
# BioDataScience1 2022.3.0
26

37
- **A05La_wrangling**, **A06La_recombination** and **A06Lb_multi-table** revised. **A05La_syntaxr** renamed **A11Lc_syntaxr**.

inst/tutorials/A05La_wrangling/A05La_wrangling.Rmd

Lines changed: 182 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD I Module 5** Remanier des données dans R."
55
tutorial:
66
id: "A05La_wrangling"
7-
version: 2.1.0/3
7+
version: 2.2.0/5
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -15,11 +15,11 @@ runtime: shiny_prerendered
1515

1616
```{r setup, include=FALSE}
1717
BioDataScience1::learnr_setup()
18-
SciViews::R()
18+
SciViews::R(lang = "fr")
1919
library(BioDataScience)
2020
2121
# Dataset
22-
crabs <- read("crabs", package = "MASS", lang = "fr")
22+
crabs <- read("crabs", package = "MASS")
2323
```
2424

2525
```{r, echo=FALSE}
@@ -34,20 +34,78 @@ BioDataScience1::learnr_server(input, output, session)
3434

3535
## Objectifs
3636

37-
- 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()`
3840
- Vérifier l'acquisition des compétences relatives au chaînage des instructions
3941

40-
## Calculer de nouvelles variables
42+
## Les fonctions speedy/tidy
4143

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

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)
91+
crabs1 <- (select(crabs, species, length) |> collect_dtx())
92+
```
93+
94+
## Deux variétés de crabes
95+
96+
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")
46100
# Importation des données crabs
47-
(crabs <- read("crabs", package = "MASS", lang = "fr"))
101+
(crabs <- read("crabs", package = "MASS"))
48102
```
49103

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()` :
51109

52110
- le logarithme (`log()`) de la longueur de la carapace (`length`) des crabes et nommez cette nouvelle variables **length_log**
53111
- 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)
107165
grade_code("Vous savez maintenant comment calculer de nouvelles variables avec la fonction `smutate()`.")
108166
```
109167

110-
## Filtrer et sélectionner des données
168+
### Filtrer et sélectionner des données
111169

112170
Reprenons le jeu de données initial sur nos crabes (`crabs`).
113171

@@ -116,7 +174,7 @@ Reprenons le jeu de données initial sur nos crabes (`crabs`).
116174
(crabs <- read("crabs", package = "MASS", lang = "fr"))
117175
```
118176

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`:
120178

121179
- Retirer la variable index (`index`) du jeu de données
122180
- 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 %>.%
130188
select(., -index) %>.%
131189
filter(., sex == "M" & length >= 25) %->%
132190
crabs2
191+
# Visualisation des six premières lignes du tableau
133192
head(crabs2)
134193
```
135194

@@ -172,16 +231,42 @@ head(crabs2)
172231
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.")
173232
```
174233

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".
176235

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+
```
178243

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 `%->%`).")
182265
```
183266

184-
Réalisez les opérations suivantes :
267+
### Résumer des données
268+
269+
Réalisez les opérations suivantes sur `crabs` :
185270

186271
- Sélectionnez les individus dont la longueur (`length`) est strictement supérieur à 25 mm
187272
- 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 ___
212297
number = ___(___),
213298
observations = ___(___)) ___
214299
___
215-
___(___)
300+
# Tableau formaté avec knitr::kable()
301+
___(___)
216302
```
217303

218304
```{r pipe2_h3-hint-1}
@@ -223,7 +309,8 @@ crabs %>.%
223309
number = ___(___),
224310
observations = ___(___)) ___
225311
___
226-
kintr::kable(___)
312+
# Tableau formaté avec knitr::kable()
313+
knitr::kable(___)
227314
```
228315

229316
```{r pipe2_h3-hint-2}
@@ -234,6 +321,7 @@ crabs %>.%
234321
number = fn(___),
235322
observations = fnobs(___)) ___
236323
___
324+
# Tableau formaté avec knitr::kable()
237325
knitr::kable(___)
238326
239327
#### Attention : solution dans le 'hint' suivant! ####
@@ -248,13 +336,87 @@ crabs %>.%
248336
number = fn(width),
249337
observations = fnobs(width)) %->%
250338
crabs2
339+
# Tableau formaté avec knitr::kable()
251340
knitr::kable(crabs2)
252341
```
253342

254343
```{r pipe2_h3-check}
255344
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.")
256345
```
257346

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+
258420
## Conclusion
259421

260422
Bravo ! Vous venez de terminer votre séance d'exercices relative à la manipulation des données.

0 commit comments

Comments
 (0)