|
| 1 | +--- |
| 2 | +title: "Recombinaison de tableaux" |
| 3 | +author: "Guyliann Engels & Philippe Grosjean" |
| 4 | +description: "**SDD I Module 6** Remodelage de tableaux" |
| 5 | +tutorial: |
| 6 | + id: "A06La_recombinaison" |
| 7 | + version: 1.0.0/5 |
| 8 | +output: |
| 9 | + learnr::tutorial: |
| 10 | + progressive: true |
| 11 | + allow_skip: true |
| 12 | +runtime: shiny_prerendered |
| 13 | +--- |
| 14 | + |
| 15 | +```{r setup, include=FALSE} |
| 16 | +BioDataScience1::learnr_setup() |
| 17 | +SciViews::R() |
| 18 | +``` |
| 19 | + |
| 20 | +```{r, echo=FALSE} |
| 21 | +BioDataScience1::learnr_banner() |
| 22 | +``` |
| 23 | + |
| 24 | +```{r, context="server"} |
| 25 | +BioDataScience1::learnr_server(input, output, session) |
| 26 | +``` |
| 27 | + |
| 28 | + |
| 29 | +## Objectifs |
| 30 | + |
| 31 | +- Recombiner des tableaux larges en longs |
| 32 | +- Recombiner des tableaux longs en larges |
| 33 | +- Séparer et unifier des colonnes dans un tableau de données |
| 34 | + |
| 35 | + |
| 36 | +## De large vers long |
| 37 | + |
| 38 | +Le format long d’un tableau de données correspond à un encodage en un minimum de colonnes, les données étant réparties sur un plus grand nombre de lignes en comparaison du format large qui regroupe les données dans plusieurs colonnes successives. Il est assez courant de devoir transformer un tableau large vers un tableau long. Cela permet souvent d'obtenir un tableau cas par variables correct. La fonction utile pour cela est la fonction pivot_longer() |
| 39 | + |
| 40 | +```{r, eval=FALSE, echo=TRUE} |
| 41 | +DF %>.% |
| 42 | + pivot_longer(., cols = SELECTION, names_to = NEWVAR1, values_to = NEWVAR2) -> DF1 |
| 43 | +``` |
| 44 | + |
| 45 | +La fonction `pivot_longer()` utilise les arguments suivants : |
| 46 | + |
| 47 | +- `cols =` les variables qui doivent être pivotées |
| 48 | +- `names_to =` le nom de la nouvelle variable qui comprend le nom des colonnes pivotées. |
| 49 | +- `values_to =` le nom de la nouvelle variable qui comprend les valeurs des colonnes pivotées |
| 50 | + |
| 51 | + |
| 52 | +```{r wide-init} |
| 53 | +time <- 1989:1995 |
| 54 | +tree <- rep(c("arbre_1", "arbre_2"), each = length(time)) |
| 55 | +size <- c((time - 1990 + 12)*2, (time - 1990 + 15)*2.5) |
| 56 | +
|
| 57 | +long <- tibble( |
| 58 | + year = c(time, time), |
| 59 | + tree = tree, |
| 60 | + circumf = size |
| 61 | +) |
| 62 | +
|
| 63 | +width <- pivot_wider(long, names_from = year, values_from = circumf) |
| 64 | +long1 <- pivot_longer(width, cols= "1989":"1995", names_to = "year", values_to = "circumf") |
| 65 | +
|
| 66 | +#long11 <- pivot_longer(width, !tree, names_to = "year", values_to = "circumf") |
| 67 | +#long12 <- pivot_longer(width, starts_with("19"), names_to = "year", values_to = "circumf") |
| 68 | +``` |
| 69 | + |
| 70 | +Sur base du tableau ci-dessous : |
| 71 | + |
| 72 | +```{r} |
| 73 | +knitr::kable(width) |
| 74 | +``` |
| 75 | + |
| 76 | +Modifiez le tableau `width` afin d'obtenir le tableau suivant que vous nommerez `long`: |
| 77 | + |
| 78 | +```{r,} |
| 79 | +knitr::kable(long1) |
| 80 | +``` |
| 81 | + |
| 82 | +### Premiere variantes de l'argument cols |
| 83 | + |
| 84 | +Complétez la fonction suivante afin d'obtenir le tableau `long`. |
| 85 | + |
| 86 | +```{r wide-prep} |
| 87 | +time <- 1989:1995 |
| 88 | +tree <- rep(c("arbre_1", "arbre_2"), each = length(time)) |
| 89 | +size <- c((time - 1990 + 12)*2, (time - 1990 + 15)*2.5) |
| 90 | +
|
| 91 | +long <- tibble( |
| 92 | + year = c(time, time), |
| 93 | + tree = tree, |
| 94 | + circumf = size |
| 95 | +) |
| 96 | +
|
| 97 | +width <- pivot_wider(long, names_from = year, values_from = circumf) |
| 98 | +``` |
| 99 | + |
| 100 | +```{r wide1_h3, exercise = TRUE, exercise.setup = "wide-prep"} |
| 101 | +___ %>.% |
| 102 | + ___(., cols = "___":"___", names_to = "___", values_to = "___") -> ___ |
| 103 | +head(___) |
| 104 | +``` |
| 105 | + |
| 106 | +```{r wide1_h3-hint-1} |
| 107 | +width %>.% |
| 108 | + pivot_longer(., cols = "___":"___", names_to = "___", values_to = "___") -> long |
| 109 | +head(long) |
| 110 | +``` |
| 111 | + |
| 112 | +```{r wide1_h3-hint-2} |
| 113 | +width %>.% |
| 114 | + pivot_longer(., cols = "1989":"1995", names_to = "___", values_to = "___") -> long |
| 115 | +head(long) |
| 116 | +#### Attention : solution dans le 'hint' suivant! #### |
| 117 | +``` |
| 118 | + |
| 119 | +```{r wide1_h3-solution} |
| 120 | +width %>.% |
| 121 | + pivot_longer(., cols = "1989":"1995", names_to = "year", values_to = "circumf") -> long |
| 122 | +head(long) |
| 123 | +``` |
| 124 | + |
| 125 | +```{r wide1_h3-check} |
| 126 | +grade_code("Bravo ! Vous venez de réaliser votre premier pivot") |
| 127 | +``` |
| 128 | + |
| 129 | +### Seconde variante de l'argument cols = |
| 130 | + |
| 131 | +L'argument `cols =` de la fonction pivot accepte plusieurs solutions afin de spécifier les colonnes d'intérêts, tentez cette fois-ci de retirer la colonne qui ne doit pas subir le pivot. |
| 132 | + |
| 133 | +Complétez la fonction suivante afin d'obtenir le tableau `long`. |
| 134 | + |
| 135 | +```{r wide2_h2, exercise = TRUE, exercise.setup = "wide-prep"} |
| 136 | +___ %>.% |
| 137 | + ___(., cols = !___, names_to = "___", values_to = "___") -> ___ |
| 138 | +head(___) |
| 139 | +``` |
| 140 | + |
| 141 | +```{r wide2_h2-hint-1} |
| 142 | +width %>.% |
| 143 | + pivot_longer(., cols = !___, names_to = "year", values_to = "circumf") -> long |
| 144 | +head(___) |
| 145 | +#### Attention : solution dans le 'hint' suivant! #### |
| 146 | +``` |
| 147 | + |
| 148 | +```{r wide2_h2-solution} |
| 149 | +width %>.% |
| 150 | + pivot_longer(., cols = !tree, names_to = "year", values_to = "circumf") -> long |
| 151 | +head(long) |
| 152 | +``` |
| 153 | + |
| 154 | +```{r wide2_h2-check} |
| 155 | +grade_code("Bravo ! Vous venez de réaliser votre premier pivot") |
| 156 | +``` |
| 157 | + |
| 158 | +### Autre variante de l'argument cols = |
| 159 | + |
| 160 | +L'argument `cols =` de la fonction pivot accepte plusieurs solutions afin de spécifier les colonnes d'intérêts, tentez cette fois-ci d'utiliser la fonction start_with() afin de sélectionner les colonnes qui doivent subir le pivot. |
| 161 | + |
| 162 | +Complétez la fonction suivante afin d'obtenir le tableau `long`. |
| 163 | + |
| 164 | +```{r wide3_h2, exercise = TRUE, exercise.setup = "wide-prep"} |
| 165 | +___ %>.% |
| 166 | + ___(., cols = starts_with("___"), names_to = "___", values_to = "___") -> ___ |
| 167 | +head(___) |
| 168 | +``` |
| 169 | + |
| 170 | +```{r wide3_h2-hint-1} |
| 171 | +width %>.% |
| 172 | + pivot_longer(., cols = starts_with("___"), names_to = "year", values_to = "circumf") -> long |
| 173 | +head(long) |
| 174 | +#### Attention : solution dans le 'hint' suivant! #### |
| 175 | +``` |
| 176 | + |
| 177 | +```{r wide3_h2-solution} |
| 178 | +width %>.% |
| 179 | + pivot_longer(., cols = starts_with("19"), names_to = "year", values_to = "circumf") -> long |
| 180 | +head(long) |
| 181 | +``` |
| 182 | + |
| 183 | +```{r wide3_h2-check} |
| 184 | +grade_code("Bravo ! Vous venez de réaliser votre troisième pivot") |
| 185 | +``` |
| 186 | + |
| 187 | +## De long vers large |
| 188 | + |
| 189 | +Il est plus rare de passer d'un tableau long vers un tableau large. Cela est souvent utilisé lorsque l'on souhaite transformer ce tableau afin de le rendre plus compact et présentable dans un rapport ou dans une présentation. La fonction utile pour cette transformation est pivot_wider() |
| 190 | + |
| 191 | +```{r, eval=FALSE, echo=TRUE} |
| 192 | +DF %>.% |
| 193 | + pivot_wider(., names_from = VAR1, values_from = VAR2) -> DF1 |
| 194 | +``` |
| 195 | + |
| 196 | +La fonction `pivot_wider()` requiert pour l'argument |
| 197 | + |
| 198 | +- `cols =` les variables qui doivent être pivotées |
| 199 | +- `names_from =` le nom de la variable dont les valeurs vont être employées comme les noms des nouvelles variables. |
| 200 | +- `values_from =` le nom de la variable dont les valeurs vont être employées comme les valeurs des nouvelles variables. |
| 201 | + |
| 202 | + |
| 203 | +```{r long-init} |
| 204 | +gr_age <- c("Jeune", "Adulte","Senior") |
| 205 | +period <- c(1992, 1995, 1998) |
| 206 | +popu <- c(2185103, 6311109, 1525785, |
| 207 | + 2196799, 6337067, 1596532, |
| 208 | + 2180816, 6332857, 1678591) |
| 209 | +
|
| 210 | +demography <- tibble( |
| 211 | + groupe_age = rep(gr_age, times = 3), |
| 212 | + year = rep(period, each= 3), |
| 213 | + population = popu |
| 214 | +) |
| 215 | +
|
| 216 | +demo <- pivot_wider(demography, names_from = year, values_from = population) |
| 217 | +#demo1 <- spread(demography, key = year, value = population) |
| 218 | +``` |
| 219 | + |
| 220 | +Sur base du tableau ci-dessous : |
| 221 | + |
| 222 | +```{r} |
| 223 | +knitr::kable(demography) |
| 224 | +``` |
| 225 | + |
| 226 | +Modifiez le tableau `demography` afin d'obtenir le tableau suivant que vous nommerez `demo`: |
| 227 | + |
| 228 | +```{r} |
| 229 | +knitr::kable(demo) |
| 230 | +``` |
| 231 | + |
| 232 | +```{r long-prep} |
| 233 | +gr_age <- c("Jeune", "Adulte","Senior") |
| 234 | +period <- c(1992, 1995, 1998) |
| 235 | +popu <- c(2185103, 6311109, 1525785, |
| 236 | + 2196799, 6337067, 1596532, |
| 237 | + 2180816, 6332857, 1678591) |
| 238 | +
|
| 239 | +demography <- tibble( |
| 240 | + groupe_age = rep(gr_age, times= 3), |
| 241 | + year = rep(period, each= 3), |
| 242 | + population = popu |
| 243 | +) |
| 244 | +``` |
| 245 | + |
| 246 | +Complétez la fonction ci-dessous. |
| 247 | + |
| 248 | +```{r long_h2, exercise = TRUE, exercise.setup = "long-prep"} |
| 249 | +___ %>.% |
| 250 | + ___(., names_from = ___, values_from = ___) -> ___ |
| 251 | +head(___) |
| 252 | +``` |
| 253 | + |
| 254 | +```{r long_h2-hint-1} |
| 255 | +demography %>.% |
| 256 | + pivot_wider(., names_from = ___, values_from = ___) -> demo |
| 257 | +head(demo) |
| 258 | +#### Attention : solution dans le 'hint' suivant! #### |
| 259 | +``` |
| 260 | + |
| 261 | +```{r long_h2-solution} |
| 262 | +demography %>.% |
| 263 | + pivot_wider(., names_from = year, values_from = population) -> demo |
| 264 | +head(demo) |
| 265 | +``` |
| 266 | + |
| 267 | +```{r long_h2-check} |
| 268 | +grade_code("Bravo ! Vous venez de réaliser un tableau large en partant d'un tableau long. Comme vous pouvez le voir, la syntaxe est très similaire entre pivot_wider() et pivot_longer().") |
| 269 | +``` |
| 270 | + |
| 271 | +## Diviser des colonnes dans un tableau |
| 272 | + |
| 273 | +La fonction est `separate()` est utile afin de séparer une colonne d'un tableau en plusieurs colonnes. La fonction `unite()` est la fonction complémentaire de `separate()` |
| 274 | + |
| 275 | +```{r, eval=FALSE, echo=TRUE} |
| 276 | +DF %>.% |
| 277 | + separate(., col = VARNAME, into = c("VAR1", "VAR2"), sep = "[^[:alnum:]]+") -> DF2 |
| 278 | +``` |
| 279 | + |
| 280 | +La fonction `separate()` utilise les arguments suivants : |
| 281 | + |
| 282 | +- `col =` le nom de la variable à scinder |
| 283 | +- `into =` le nom des nouvelles variables |
| 284 | +- `sep =` le séparateur qui permet de scinder la variable sélectionnée en `col =` |
| 285 | + |
| 286 | +```{r separate_init} |
| 287 | +bacteria <- tibble( |
| 288 | + measure = paste(rep(c("ind1", "ind2", "ind3"), each = 3), |
| 289 | + rep(c("2019-04-25", "2019-04-26", "2019-04-27"), times = 3), |
| 290 | + sep = "_"), |
| 291 | + value = c((11:13)^3, (11:13)^4, (11:13)^5) |
| 292 | +) |
| 293 | +
|
| 294 | +bact <- separate(bacteria, col = measure, into = c("rep", "date"), sep = "_" ) |
| 295 | +``` |
| 296 | + |
| 297 | +Sur base du tableau ci-dessous : |
| 298 | + |
| 299 | +```{r} |
| 300 | +knitr::kable(bacteria) |
| 301 | +``` |
| 302 | + |
| 303 | +Modifiez le tableau `bacteria` afin d'obtenir le tableau suivant que vous nommerez `bact`: |
| 304 | + |
| 305 | +```{r} |
| 306 | +knitr::kable(bact) |
| 307 | +``` |
| 308 | + |
| 309 | +```{r separate_prep} |
| 310 | +bacteria <- tibble( |
| 311 | + measure = paste(rep(c("ind1", "ind2", "ind3"), each = 3), |
| 312 | + rep(c("2019-04-25", "2019-04-26", "2019-04-27"), times = 3), |
| 313 | + sep = "_"), |
| 314 | + value = c((11:13)^3, (11:13)^4, (11:13)^5) |
| 315 | +) |
| 316 | +``` |
| 317 | + |
| 318 | +```{r separate_h2, exercise = TRUE, exercise.setup = "separate_prep"} |
| 319 | +___ %>.% |
| 320 | + ___(., col = ___, into = c("___", "___"), sep = "___") -> ___ |
| 321 | +head(___) |
| 322 | +``` |
| 323 | + |
| 324 | +```{r separate_h2-hint-1} |
| 325 | +bacteria %>.% |
| 326 | + separate(., col = measure, into = c("___", "___"), sep = "___") -> bact |
| 327 | +head(bact) |
| 328 | +#### Attention : solution dans le 'hint' suivant! #### |
| 329 | +``` |
| 330 | + |
| 331 | +```{r separate_h2-solution} |
| 332 | +bacteria %>.% |
| 333 | + separate(., col = measure, into = c("rep", "date"), sep = "_" ) -> bact |
| 334 | +head(bact) |
| 335 | +``` |
| 336 | + |
| 337 | +```{r separate_h2-check} |
| 338 | +grade_code("Bravo ! Vous venez de scinder une colonne de votre tableau.") |
| 339 | +``` |
| 340 | + |
| 341 | +## Conclusion |
| 342 | + |
| 343 | +Félicitation ! Vous venez de terminer votre séance d'exercices dans un tutoriel "learnr". |
| 344 | + |
| 345 | +```{r comm_noscore, echo=FALSE} |
| 346 | +question_text( |
| 347 | + "Laissez-nous vos impressions sur ce learnr", |
| 348 | + answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."), |
| 349 | + incorrect = "Vos commentaires sont enregistrés.", |
| 350 | + placeholder = "Entrez vos commentaires ici...", |
| 351 | + allow_retry = TRUE |
| 352 | +) |
| 353 | +``` |
0 commit comments