Skip to content

Commit c467433

Browse files
committed
Learnr module 4 ready for 2025-2026
1 parent b64bc8b commit c467433

File tree

3 files changed

+110
-87
lines changed

3 files changed

+110
-87
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: 2025.3.0
2+
Version: 2025.4.0
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 2025.4.0
2+
3+
- Learnr **A04La_wrangling** revised for 2025-2026.
4+
15
# BioDataScience1 2025.3.0
26

37
- Learnrs **A03La_barplot**, **A03Lb_boxplot** and **A03Lc_comp_fig** revised for 2025-2026.

inst/tutorials/A04La_wrangling/A04La_wrangling.Rmd.inactivated renamed to inst/tutorials/A04La_wrangling/A04La_wrangling.Rmd

Lines changed: 105 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,36 @@ runtime: shiny_prerendered
1616
```{r setup, include=FALSE}
1717
BioDataScience1::learnr_setup()
1818
SciViews::R(lang = "fr")
19+
# Required for RSConnect
20+
# SciViews::R
21+
library(rlang)
22+
library(data.table)
23+
library(ggplot2)
24+
library(tibble)
25+
library(tidyr)
26+
library(dplyr)
27+
library(dtplyr)
28+
library(broom)
29+
library(forcats)
30+
library(collapse)
31+
library(fs)
32+
library(data.trame)
33+
library(svFast)
34+
library(svTidy)
35+
library(svMisc)
36+
library(svBase)
37+
library(svFlow)
38+
library(data.io)
39+
library(chart)
40+
library(tabularise)
41+
library(SciViews)
42+
# ... more
43+
library(readxl)
44+
library(testthat)
45+
library(equatags)
1946
library(BioDataScience)
2047
48+
2149
# Dataset
2250
crabs <- read("crabs", package = "MASS")
2351
```
@@ -42,42 +70,34 @@ BioDataScience1::learnr_server(input, output, session)
4270

4371
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 :
4472

45-
- Vérifier l'acquisition des notions relatives au remaniement des données avec les fonctions `select()`/`sselect()`, `filter()`/`sfilter()`, `mutate()`/`smutate()`, `group_by()`/`sgroup_by()`, `summarise()`/`ssummarise()`
73+
- Vérifier l'acquisition des notions relatives au remaniement des données avec les fonctions `select_()`/`select()`, `filter_()`/`filter()`, `mutate_()`/`mutate()`, `group_by_()`/`group_by()`, `summarise_()`/`summarise()`
4674
- Vérifier l'acquisition des compétences relatives au chaînage des instructions
4775

48-
## Les fonctions speedy/tidy
76+
## Les fonctions svTidy/Tidyverse
4977

5078
L'instruction `SciViews::R` ou `SciViews::R()` qui est équivalente, est employée pour charger une série cohérente de packages R. Nous l'utilisons en début de script R ou dans le premier chunk d'un document Quarto ou R Markdown.
5179

5280
```{r, echo=TRUE, eval=FALSE}
5381
SciViews::R()
5482
```
5583

56-
Vous employez des tableaux de données depuis le premier module de ce cours pour réaliser des graphiques. Vous allez à présent apprendre à les manipuler. Il existe dans R plusieurs types d'objets pour contenir des jeux de données, dont **data.frame**, tibble (objet **tbl_df**) ou **data.table**. Par défaut dans `SciViews::R`, vous travaillez avec des **data.table**s. 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é de gros jeux de données mais cela va venir plus vite que vous ne l'imaginez.
84+
Vous employez des tableaux de données depuis le premier module de ce cours pour réaliser des graphiques. Vous allez à présent apprendre à les manipuler. Il existe dans R plusieurs types d'objets pour contenir des jeux de données, dont **data.frame**, tibble (objet **tbl_df**) ou **data.table**. Par défaut dans `SciViews::R`, vous travaillez avec des **data.trame**s. La vitesse de traitements et la gestion en mémoire des objets **data.trame** en font le choix idéal pour traiter des gros jeux de données. Actuellement, vous n'avez pas encore traité de gros jeux de données mais cela va venir plus vite que vous ne l'imaginez.
5785

5886
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...
5987

60-
Parmi les fonctions de remaniement de tableaux, nous avons les fonctions "speedy" qui visent à 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.
61-
62-
```{r, echo=TRUE}
63-
list_speedy_functions()
64-
```
88+
Parmi les fonctions de remaniement de tableaux, nous avons les fonctions svTidy qui visent à accélérer le traitement dans R. Ces fonctions sont compatibles avec les objets **data.trame**. Elles sont suffixées avec un "_" pour les reconnaître facilement.
6589

66-
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".
67-
68-
```{r, echo=TRUE}
69-
list_tidy_functions()
70-
```
90+
Un second ensemble est constitué des fonctions [Tidyverse](https://www.tidyverse.org), et portant le même nom que leurs homologues svTidy, mais non suffixées d'un "_". Elles sont couramment utilisées dans R, mais, dans la plupart des cas, plus lentes que les fonctions svTidy correspondantes, et elles n'utilisent pas l'interface formule qsui vous est familière avec, entre autres, `chart()`.
7191

72-
Nous retrouvons donc des paires de fonctions speedy/tidy qui réalisent des traitements très similaires et ont une syntaxe identique ou très proche. Elles permettent de :
92+
Nous retrouvons donc des paires de fonctions svTidy/Tidyverse qui réalisent des traitements très similaires et ont une syntaxe relativement proche. Elles permettent de :
7393

74-
- sélectionner des colonnes d'un jeu de données avec `sselect()`/`select()`
75-
- filtrer des lignes dans un jeu de données avec `sfilter()`/`filter()`
76-
- calculer de nouvelles variables dans un jeu de données avec `smutate()`/`mutate()`
77-
- indiquer les variables de regroupement à utiliser dans un tableau avec `sgroup_by()`/`group_by()`
78-
- résumer les variables d'un jeu de données avec `ssummarise()`/`summarise()`
94+
- sélectionner des colonnes d'un jeu de données avec `select_()`/`select()`
95+
- filtrer des lignes dans un jeu de données avec `filter_()`/`filter()`
96+
- calculer de nouvelles variables dans un jeu de données avec `mutate_()`/`mutate()`
97+
- indiquer les variables de regroupement à utiliser dans un tableau avec `group_by_()`/`group_by()`
98+
- résumer les variables d'un jeu de données avec `summarise_()`/`summarise()`
7999

80-
*Nous vous conseillons d'employer préférentiellement les fonctions speedy.* Dans ce tutoriel, nous utiliserons alternativement les deux pour se familiariser avec les deux syntaxes.
100+
*Nous vous conseillons d'employer préférentiellement les fonctions svTidy.* Cependant, dans ce tutoriel nous utiliserons alternativement les deux pour se familiariser avec les deux syntaxes.
81101

82102
## Deux variétés de crabes
83103

@@ -93,7 +113,7 @@ Ce tableau contient `r nrow(crabs)` observations et `r ncol(crabs)` variables. L
93113

94114
### Calculer de nouvelles variables
95115

96-
Calculez sur le tableau `crabs` à l'aide de la fonction speedy `smutate()` :
116+
Calculez sur le tableau `crabs` à l'aide de la fonction svTidy `mutate_()` :
97117

98118
- le logarithme (`log()`) de la longueur de la carapace (`length`) des crabes et nommez cette nouvelle variables `log_length`
99119
- la racine carrée (`sqrt()`) de la largueur de la carapace (`width`) et nommez cette nouvelle variable `sqrt_width`
@@ -102,10 +122,10 @@ Calculez sur le tableau `crabs` à l'aide de la fonction speedy `smutate()` :
102122
Affichez ensuite les premières lignes du tableau (`head()`). Par défaut, les six premières lignes sont affichées. Vous devez obtenir le tableau ci-dessous :
103123

104124
```{r}
105-
crabs <- smutate(crabs,
106-
log_length = log(length),
107-
sqrt_width = sqrt(width),
108-
front_m = front / 1000)
125+
crabs <- mutate_(crabs,
126+
log_length = ~log(length),
127+
sqrt_width = ~sqrt(width),
128+
front_m = ~front / 1000)
109129
# Visualisation des premières lignes du tableau
110130
head(crabs)
111131
```
@@ -120,7 +140,7 @@ ___(___)
120140
```
121141

122142
```{r mutate_h3-hint-1}
123-
DF <- smutate(___,
143+
DF <- mutate_(___,
124144
log_length = ___,
125145
sqrt_width = ___,
126146
front_m = ___)
@@ -129,9 +149,9 @@ head(___)
129149
```
130150

131151
```{r mutate_h3-hint-2}
132-
crabs <- smutate(crabs,
133-
log_length = log(___),
134-
sqrt_width = sqrt(___),
152+
crabs <- mutate_(crabs,
153+
log_length = ~log(___),
154+
sqrt_width = ~sqrt(___),
135155
front_m = ___ / 1000)
136156
# Visualisation des premières lignes du tableau
137157
head(___)
@@ -141,16 +161,16 @@ head(___)
141161

142162
```{r mutate_h3-solution}
143163
## Solution ##
144-
crabs <- smutate(crabs,
145-
log_length = log(length),
146-
sqrt_width = sqrt(width),
147-
front_m = front / 1000)
164+
crabs <- mutate_(crabs,
165+
log_length = ~log(length),
166+
sqrt_width = ~sqrt(width),
167+
front_m = ~front / 1000)
148168
# Visualisation des premières lignes du tableau
149169
head(crabs)
150170
```
151171

152172
```{r mutate_h3-check}
153-
grade_code("Vous savez maintenant comment calculer de nouvelles variables avec la fonction speedy `smutate()`.")
173+
grade_code("Vous savez maintenant comment calculer de nouvelles variables avec la fonction svTidy `mutate_()` qui utilise des formules commençant par `~` pour effectuer les transformations désirées.")
154174
```
155175

156176
### Filtrer et sélectionner des données
@@ -162,7 +182,7 @@ Reprenons le jeu de données initial `crabs`.
162182
(crabs <- read("crabs", package = "MASS", lang = "fr"))
163183
```
164184

165-
Réalisez les opérations suivantes avec les fonctions **tidy** `filter()` et `select()` et assignez votre résultat à `crabs2` :
185+
Réalisez les opérations suivantes avec les fonctions **Tidyverse** `filter()` et `select()` et assignez votre résultat à `crabs2` :
166186

167187
- Retirer la variable index (`index`) du jeu de données
168188
- Garder uniquement les individus mâles (`"M"`) du jeu de données dont la longueur de la carapace est supérieure ou égale à 25 mm (variables `sex` et `length` respectivement)
@@ -216,10 +236,10 @@ head(crabs2)
216236
```
217237

218238
```{r pipe1_h3-check}
219-
grade_code("La sélection de vos variables avec `select()` et de vos observations avec `filter()` (fonctions tidy) réalisent cette transformation. En général dans un pipeline, finissez toujours en assignant avec -> pour que l'assignation apparaisse à la fin dans la logique de succession des opérations et mettez en évidence le nom auquel vous assignez en le plaçant sur une nouvelle ligne.")
239+
grade_code("La sélection de vos variables avec `select()` et de vos observations avec `filter()` (fonctions tidyverse) réalisent cette transformation. En général dans un pipeline, finissez toujours en assignant avec `->` pour que l'assignation apparaisse à la fin dans la logique de succession des opérations et mettez en évidence le nom auquel vous assignez en le plaçant sur une nouvelle ligne.")
220240
```
221241

222-
Afin de comparer les fonctions speedy et tidy, réalisez le même exercice en utilisant des fonctions "speedy".
242+
Afin de comparer les fonctions svTidy et tidyverse, réalisez le même exercice en utilisant cette fois-ci des fonctions svTidy.
223243

224244
```{r pipe1s_h2, exercise=TRUE}
225245
crabs ___
@@ -231,7 +251,7 @@ head(crabs2)
231251

232252
```{r pipe1s_h2-hint-1}
233253
crabs %>.%
234-
sselect(___, ___) ___
254+
select_(___, ___) ___
235255
___(___, ___ & ___) ->
236256
crabs2
237257
head(crabs2)
@@ -242,14 +262,14 @@ head(crabs2)
242262
```{r pipe1s_h2-solution}
243263
## Solution ##
244264
crabs %>.%
245-
sselect(., -index) %>.%
246-
sfilter(., sex == "M" & length >= 25) ->
265+
select_(., ~-index) %>.%
266+
filter_(., ~sex == "M" & length >= 25) ->
247267
crabs2
248268
head(crabs2)
249269
```
250270

251271
```{r pipe1s_h2-check}
252-
grade_code("Vous voyez que les fonctions `select()` et `sselect()`, ainsi que `filter()` et `sfilter()` apparaissent souvent interchageables. Les résultats ne sont cependant pas toujours similaires et vous devez restez attentif à cela dans votre code, par exemple, si vous traduisez un exemple tidy trouvé sur le Web en version speedy.")
272+
grade_code("Vous voyez que les fonctions `select()` et `select_()`, ainsi que `filter()` et `filter_()` apparaissent souvent interchageables, à condition de bien penser à utiliser des formules avec les fonctions svTidy (ajouter un `~` au début des expressions. Les résultats ne sont cependant pas toujours similaires et vous devez restez attentif à cela dans votre code, par exemple, si vous traduisez un exemple tidyverse trouvé sur le Web en version svTidy.")
253273
```
254274

255275
### Résumer des données
@@ -264,16 +284,16 @@ Réalisez les opérations suivantes sur `crabs` :
264284
- Assignez le résultat à `crabs2`
265285
- Formatez votre tableau `crabs2` avec `knitr::kable()`
266286

267-
Employez des fonction speedy et fstat uniquement et le chaînage des opérations avec `%>.%` dans un pipeline pour résoudre cette exercice. Vous devez obtenir le tableau ci-dessous :
287+
Employez des fonction svTidy et fstat uniquement (pour rappel, les functions fast commencent par un `f`, par exemple, `fmean()` est l'équivalent fast de la fonction R de base `mean()`) et le chaînage des opérations avec `%>.%` dans un pipeline pour résoudre cette exercice. Vous devez obtenir le tableau ci-dessous :
268288

269289
```{r}
270290
crabs %>.%
271-
sfilter(., length > 25) %>.%
272-
sgroup_by(., sex, species) %>.%
273-
ssummarise(.,
274-
mean = fmean(width),
275-
ntot = fn(width),
276-
nobs = fnobs(width)) ->
291+
filter_(., ~length > 25) %>.%
292+
group_by_(., ~sex, ~species) %>.%
293+
summarise_(.,
294+
mean = ~fmean(width),
295+
ntot = ~fn(width),
296+
nobs = ~fnobs(width)) ->
277297
crabs2
278298
knitr::kable(crabs2)
279299
```
@@ -293,9 +313,9 @@ ___(___)
293313

294314
```{r pipe2_h3-hint-1}
295315
crabs %>.%
296-
sfilter(___, ___) ___
297-
sgroup_by(___, ___, ___) ___
298-
ssummarise(___,
316+
filter_(___, ___) ___
317+
group_by_(___, ___, ___) ___
318+
summarise_(___,
299319
mean = ___(___),
300320
ntot = ___(___),
301321
nobs = ___(___)) ___
@@ -306,12 +326,12 @@ knitr::kable(___)
306326

307327
```{r pipe2_h3-hint-2}
308328
crabs %>.%
309-
sfilter(., length > ___) %>.%
310-
sgroup_by(., ___, ___) %>.%
311-
ssummarise(.,
312-
mean = fmean(___),
313-
ntot = fn(___),
314-
nobs = fnobs(___)) ___
329+
filter_(., ~length > ___) %>.%
330+
group_by_(., ___, ___) %>.%
331+
summarise_(.,
332+
mean = ~fmean(___),
333+
ntot = ~fn(___),
334+
nobs = ~fnobs(___)) ___
315335
___
316336
# Tableau formaté avec knitr::kable()
317337
knitr::kable(___)
@@ -322,22 +342,22 @@ knitr::kable(___)
322342
```{r pipe2_h3-solution}
323343
## Solution ##
324344
crabs %>.%
325-
sfilter(., length > 25) %>.%
326-
sgroup_by(., sex, species) %>.%
327-
ssummarise(.,
328-
mean = fmean(width),
329-
ntot = fn(width),
330-
nobs = fnobs(width)) ->
345+
filter_(., ~length > 25) %>.%
346+
group_by_(., ~sex, ~species) %>.%
347+
summarise_(.,
348+
mean = ~fmean(width),
349+
ntot = ~fn(width),
350+
nobs = ~fnobs(width)) ->
331351
crabs2
332352
# Tableau formaté avec knitr::kable()
333353
knitr::kable(crabs2)
334354
```
335355

336356
```{r pipe2_h3-check}
337-
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()`.")
357+
grade_code("Vous avez maintenant compris comment résumer vos données avec `group_by_()` et `summarise_()` et formater vos sorties avec `knitr::kable()`.")
338358
```
339359

340-
Réalisez à présent un exercice similaire, toujour avec les fonctions speedy :
360+
Réalisez à présent un exercice similaire, toujour avec les fonctions svTidy :
341361

342362
- Sélectionnez les individus dont la longueur (`length`) est strictement *inférieur ou égale* à 25 mm
343363
- Résumez le jeu de données par le sexe (`sex`) et par la variété (`species`) de crabe
@@ -350,11 +370,11 @@ Employez le chaînage des opérations `%>.%` au sein d'un pipeline pour résoudr
350370

351371
```{r}
352372
crabs %>.%
353-
sfilter(., length <= 25) %>.%
354-
sgroup_by(., sex, species) %>.%
355-
ssummarise(.,
356-
median = fmedian(width),
357-
ntot = fn(width)) ->
373+
filter_(., ~length <= 25) %>.%
374+
group_by_(., ~sex, ~species) %>.%
375+
summarise_(.,
376+
median = ~fmedian(width),
377+
ntot = ~fn(width)) ->
358378
crabs2
359379
# Tableau formaté avec knitr::kable()
360380
knitr::kable(crabs2)
@@ -374,9 +394,9 @@ ___(___)
374394

375395
```{r pipe3_h3-hint-1}
376396
crabs %>.%
377-
sfilter(___, ___) ___
378-
sgroup_by(___, ___, ___) ___
379-
ssummarise(___,
397+
filter_(___, ___) ___
398+
group_by_(___, ___, ___) ___
399+
summarise_(___,
380400
median = ___(___),
381401
ntot. = ___(___)) ___
382402
___
@@ -386,11 +406,11 @@ knitr::kable(___)
386406

387407
```{r pipe3_h3-hint-2}
388408
crabs %>.%
389-
sfilter(., length <= ___) %>.%
390-
sgroup_by(., ___, ___) %>.%
391-
ssummarise(.,
392-
median = fmedian(___),
393-
ntot = fn(___)) ___
409+
filter_(., ~length <= ___) %>.%
410+
group_by_(., ___, ___) %>.%
411+
summarise_(.,
412+
median = ~fmedian(___),
413+
ntot = ~fn(___)) ___
394414
___
395415
# Tableau formaté avec knitr::kable()
396416
knitr::kable(___)
@@ -401,18 +421,18 @@ knitr::kable(___)
401421
```{r pipe3_h3-solution}
402422
## Solution ##
403423
crabs %>.%
404-
sfilter(., length <= 25) %>.%
405-
sgroup_by(., sex, species) %>.%
406-
ssummarise(.,
407-
median = fmedian(width),
408-
ntot = fn(width)) ->
424+
filter_(., ~length <= 25) %>.%
425+
group_by_(., ~sex, ~species) %>.%
426+
summarise_(.,
427+
median = ~fmedian(width),
428+
ntot = ~fn(width)) ->
409429
crabs2
410430
# Tableau formaté avec knitr::kable()
411431
knitr::kable(crabs2)
412432
```
413433

414434
```{r pipe3_h3-check}
415-
grade_code("Vous savez maintenant résumer vos données avec `sgroup_by()` et `ssummarise()`.")
435+
grade_code("Vous savez maintenant résumer vos données avec `group_by_()` et `summarise_()`.")
416436
```
417437

418438
## Conclusion
@@ -421,9 +441,8 @@ Bravo ! Vous venez de terminer votre séance d'exercices relative à la manipul
421441

422442
Vous avez maintenant un aperçu de :
423443

424-
- notions relatives aux remaniement des données avec les fonctions `(s)select()`, `(s)filter()`, `(s)mutate()`, `(s)group_by()`, `(s)summarise()`
444+
- notions relatives aux remaniement des données avec les fonctions `select_()`/`select()`, `filter_()`/`filter()`, `mutate_()`/`mutate()`, `group_by_()`/`group_by()`, `summarise_()`/`summarise()`
425445
- chaînages des instructions dans un pipeline avec `%>.%`
426-
- l'assignation alternative `%->%` en fin de pipeline tidy pour collecter les résultats dans un tableau
427446

428447
```{r comm_noscore, echo=FALSE}
429448
question_text(

0 commit comments

Comments
 (0)