class: center, middle, inverse, title-slide # Package Dplyr ## Cours FAS1002 ### Cynthia Bello --- # Introduction .pull-left[ <img src="images/dplyr_logo.png" alt="Dplyr_logo" width="300"/> ] .pull-right[`Dplyr` est un package de l'univers Tidyverse qui a pour but de faciliter la manipulation de données. <br><br> `Dplyr` est fortement inspiré du package `plyr`, mais vient régler des problèmes de lenteur des programmes, entre autres en permettant de travailler avec des données contenues dans des bases de données externes. ] --- ## *Cheat Sheet* Les différentes fonctions et possibilités avec Dplyr sont réunies dans **Data transformation with dplyr : : CHEAT SHEET**  --- ## *Cheat Sheet* .pull-left[  ] .pull-right[ ### Sur github.com/CynthiaBH : [data-transformation.pdf](data-transformation.pdf) ] --- class: center # Importation des données -- Pour démontrer les fonctions de Dplyr, nous allons utilisé les données brutes de [palmerpenguins](https://allisonhorst.github.io/palmerpenguins/reference/penguins_raw.html#format) ```r library(palmerpenguins) data_penguin = (penguins_raw) data_penguin_tidy = (penguins) ``` <img src="images/palmerpenguins.png" alt="PalmerPenguins" width="250"/> --- class: middle <table class="table" style="font-size: 10px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> studyName </th> <th style="text-align:right;"> Sample Number </th> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Stage </th> <th style="text-align:left;"> Individual ID </th> <th style="text-align:left;"> Clutch Completion </th> <th style="text-align:left;"> Date Egg </th> <th style="text-align:right;"> Culmen Length (mm) </th> <th style="text-align:right;"> Culmen Depth (mm) </th> <th style="text-align:right;"> Flipper Length (mm) </th> <th style="text-align:right;"> Body Mass (g) </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Delta 15 N (o/oo) </th> <th style="text-align:right;"> Delta 13 C (o/oo) </th> <th style="text-align:left;"> Comments </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Adult not sampled. </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N3A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.76651 </td> <td style="text-align:right;"> -25.32426 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N3A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 8.66496 </td> <td style="text-align:right;"> -25.29805 </td> <td style="text-align:left;"> NA </td> </tr> </tbody> </table> --- class: inverse center middle # 🐧 Les Fonctions de Dplyr 🐧 --- class: center, middle ### Manipulation -- ### Sommaire -- ### Regrouper -- ### Joindre des *dataframes* --- ## Petites notes: À certains endroits, je vais utiliser: - `%<>%` emprunté à *Magrittr* pour écrire `dataframe %<>% fonction` au lieu de `dataframe <- dataframe %>% fonction` --- ## Avant de commencer... .pull-left[ Il y a certaines valeurs **N/A** parmi les variables numériques: - `Culmen Length (mm)` - `Culmen Depth (mm)` - `Flipper Length (mm)` - `Body Mass (g)` ... qu'on aimerait "éliminer" pour faire certains calculs. ] .pull-right[ <img src="images/culmen.jpg" alt="Culmen" width="300"/> ] Nous voulons quand même garder une version des données brutes, alors nous allons créer un autre *dataframe* pour nos calculs de la section **Sommaire**: <center>`data_calcs` --- class: inverse center middle # 🐧 Manipulation 🐧 --- # Manipulation <center><img src="images/dplyr_vs_baseR.png" alt="Dplyr vs Base" width="550"/> <div class="caption">Source: https://cran.r-project.org</div> --- # Manipulation ### filter() -- ```r data_calcs <- data_penguin %>% filter(across(c(10:13), ~ !is.na(.x))) ``` > *10:13 = les positions des colonnes : `Culmen Length (mm)`, `Culmen Depth (mm)`, `Flipper Length (mm)` et `Body Mass (g)`.* -- <center>On vérifie si les rangées contenant des **NA** dans les colonnes choisies ci-haut, ont bel et bien été filtrées. .pull-left[ ```r data_penguin %>% count() ``` ``` ## # A tibble: 1 x 1 ## n ## <int> ## 1 344 ``` ] .pull-right[ ```r data_calcs %>% count() ``` ``` ## # A tibble: 1 x 1 ## n ## <int> ## 1 342 ``` ] Ceci va nous éviter de spécifier **`!is.na`** ou **`na.rm = TRUE`** à chaque fois. --- > Si on veut vraiment vérifier s'il n'y a pas de valeur **NA** restantes dans nos 4 colonnes, on peut utiliser une autre fonction de `dplyr` -- ### select() ```r data_calcs %>% select(10:13) %>% summarise_all(list(~sum(is.na(.)))) ``` ``` ## # A tibble: 1 x 4 ## `Culmen Length (mm)` `Culmen Depth (mm)` `Flipper Length (mm)` `Body Mass (g)` ## <int> <int> <int> <int> ## 1 0 0 0 0 ``` -- <u>En Base R</u> ```r which(is.na(data_calcs[10:13])) ``` ``` ## integer(0) ``` --- # Manipulation <u>**Objectif**</u> : "Nettoyer" nos données brutes pour arriver aux données *tidy* disponibles sur le site de [palmerpenguins](https://allisonhorst.github.io/palmerpenguins/reference/penguins_raw.html#format) ```r kable(head(data_penguin), caption = "Données Brutes") %>% kable_styling(full_width = F, font_size = 10) ``` <table class="table" style="font-size: 10px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Données Brutes</caption> <thead> <tr> <th style="text-align:left;"> studyName </th> <th style="text-align:right;"> Sample Number </th> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Stage </th> <th style="text-align:left;"> Individual ID </th> <th style="text-align:left;"> Clutch Completion </th> <th style="text-align:left;"> Date Egg </th> <th style="text-align:right;"> Culmen Length (mm) </th> <th style="text-align:right;"> Culmen Depth (mm) </th> <th style="text-align:right;"> Flipper Length (mm) </th> <th style="text-align:right;"> Body Mass (g) </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Delta 15 N (o/oo) </th> <th style="text-align:right;"> Delta 13 C (o/oo) </th> <th style="text-align:left;"> Comments </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Adult not sampled. </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N3A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.76651 </td> <td style="text-align:right;"> -25.32426 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N3A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 8.66496 </td> <td style="text-align:right;"> -25.29805 </td> <td style="text-align:left;"> NA </td> </tr> </tbody> </table> --- class: center, middle ```r kable(head(data_penguin_tidy), caption = "Données Tidy") %>% kable_styling(full_width = F, font_size = 20) ``` <table class="table" style="font-size: 20px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Données Tidy</caption> <thead> <tr> <th style="text-align:left;"> species </th> <th style="text-align:left;"> island </th> <th style="text-align:right;"> bill_length_mm </th> <th style="text-align:right;"> bill_depth_mm </th> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> <th style="text-align:left;"> sex </th> <th style="text-align:right;"> year </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> </tbody> </table> --- ### <u>Éléments à modifier</u> 1. <u>Enlever des colonnes:</u> - `studyName, Sample Number, Region, Stage, Individual ID, Clutch Completion, Delta 15 N, Delta 13 C, Comments` 1. <u>Changer le nom des colonnes:</u> - `Culmen lenght (mm)` devient `bill_lenght_mm` - `Culmen depth (mm)` devient `bill_depth_mm` - `Flipper lenght (mm)` devient `flipper_lenght_mm` - `Body Mass (g)` devient `body_mass_g` 1. Extraire année de la variable `Date Egg` qui devient `year` 1. Déplacer colonne `year` > <center>*Le résultat des modifications à `data_penguin` (données brutes) sera sauvegardé dans `data_penguin_clean` dans la prochaine section.* --- ## 1. Exercice: Enlever des colonnes ### select() > **syntaxe:** select(df, colonne.s) <u>*ou*</u> df %>% select(colonne.s) ✏️Essayez ! -- <u>Une réponse possible:</u> ```r #Sélectionner que les colonnes qui restent data_penguin_clean <- data_penguin %>% select(c(3,5,9:14)) ``` <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Date Egg </th> <th style="text-align:right;"> Culmen Length (mm) </th> <th style="text-align:right;"> Culmen Depth (mm) </th> <th style="text-align:right;"> Flipper Length (mm) </th> <th style="text-align:right;"> Body Mass (g) </th> <th style="text-align:left;"> Sex </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> FEMALE </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> MALE </td> </tr> </tbody> </table> --- <u>Autre réponse possible:</u> ```r # Sélectionner les colonnes à enlever data_penguin_clean <- data_penguin %>% select(-c(1,2,4,6:8,15:17)) ``` -- On pourrait lister les colonnes par nom également -- ... et sûrement plusieurs autres possibilités -- ### Autres caractéristiques de sélection pour select() - everything() - last_col() - starts_with() - ends_with() - contains() - matches() - num_range() - where() Il y a aussi: `select_if, select_all, select_at` --- ## 2. Exercice: Changer le nom des colonnes ### rename() > **syntaxe:** rename(df, nouv_nom = ancien_nom) <u>*ou*</u> df %>% rename(nouv_nom = ancien_nom) ✏️Essayez ! -- <u>Une réponse possible:</u> ```r data_penguin_clean %<>% rename( bill_length_mm = `Culmen Length (mm)`, bill_depth_mm = `Culmen Depth (mm)`, flipper_length_mm = `Flipper Length (mm)`, body_mass_g = 7 #On peut aussi indiquer l'indice de la colonne ) ``` --- ### rename() Les noms des variables *tidy* et les valeurs de la colonne `sex` sont toutes en minuscules, alors changeons cela également. ```r data_penguin_clean %<>% rename_all(tolower) # En Base R data_penguin_clean$sex <- tolower(data_penguin_clean$sex) ``` Regardons le résultat: -- <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> species </th> <th style="text-align:left;"> island </th> <th style="text-align:left;"> date egg </th> <th style="text-align:right;"> bill_length_mm </th> <th style="text-align:right;"> bill_depth_mm </th> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> <th style="text-align:left;"> sex </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> male </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> female </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> female </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> female </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> male </td> </tr> </tbody> </table> -- Comme `select()`, il y a aussi: `rename_if, rename_all, rename_at` --- ## 3. Exercice: Extraire année de la variable *date egg* Pour obtenir une colonne `year` avec l'année de la colonne `date egg`, on pourrait extraire l'année seulement puis la placer dans une nouvelle colonne à la fin du *dataframe* grâce à ... -- ### mutate() ou transmute() > **syntaxe:** mutate(df, nouvelle_colonne) <u>*ou*</u> df %>% mutate(nouvelle_colonne) ✏️Essayez ! -- <u>Une réponse possible:</u> ```r dt <- data_penguin_clean %>% mutate(year = format(`date egg`, format="%Y")) dt %<>% select(-3) #enlever l'ancienne colonne `date egg` ``` <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> species </th> <th style="text-align:left;"> island </th> <th style="text-align:right;"> bill_length_mm </th> <th style="text-align:right;"> bill_depth_mm </th> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> <th style="text-align:left;"> sex </th> <th style="text-align:left;"> year </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> 2007 </td> </tr> </tbody> </table> --- ## 3. Exercice: Extraire année de la variable *Date Egg* (suite) On aurait pu aussi, ne garder que l'année dans la colonne `date egg`, changer le nom de la colonne, puis la déplacer en dernière position du *dataframe* grâce à ... -- ### relocate() > relocate(df, ..., .before = NULL, .after = NULL) *par défaut va placer la colonne en premier* -- ```r data_penguin_clean$`date egg` <- format(data_penguin_clean$`date egg`, format="%Y") data_penguin_clean %<>% rename(year = `date egg`) %>% relocate(year, .after = last_col()) ``` -- <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> species </th> <th style="text-align:left;"> island </th> <th style="text-align:right;"> bill_length_mm </th> <th style="text-align:right;"> bill_depth_mm </th> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> <th style="text-align:left;"> sex </th> <th style="text-align:left;"> year </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> 2007 </td> </tr> </tbody> </table> --- class: inverse center middle # 🐧 Sommaire 🐧 --- # Sommaire ### summarise(): > summarise(.data, ..., .groups = NULL ) ```r data_calcs %>% summarise(mean_mass = mean(`Body Mass (g)`)) ``` ``` ## # A tibble: 1 x 1 ## mean_mass ## <dbl> ## 1 4202. ``` ```r data_calcs %>% summarise(med_flipper = median(`Flipper Length (mm)`)) ``` ``` ## # A tibble: 1 x 1 ## med_flipper ## <dbl> ## 1 197 ``` -- <u>Autres fonctions qui peuvent être utilisées avec `summarise()`:</u> `sd(), IQR(), mad(),min(), max(), quantile(),first(), last(), nth(),n(), n_distinct(),any(), all()` --- # Sommaire .pull-left[ <u>`summarise()`</u>: ```r data_calcs %>% summarise(mean_mass = mean(`Body Mass (g)`)) ``` ``` ## # A tibble: 1 x 1 ## mean_mass ## <dbl> ## 1 4202. ``` ```r data_calcs %>% summarise(med_flipper = median(`Flipper Length (mm)`)) ``` ``` ## # A tibble: 1 x 1 ## med_flipper ## <dbl> ## 1 197 ``` ] .pull-right[ <u>Base R</u> : ```r mean(data_calcs$`Body Mass (g)`) ``` ``` ## [1] 4201.754 ``` ```r median(data_calcs$`Flipper Length (mm)`) ``` ``` ## [1] 197 ``` ] --- # Sommaire .pull-left[ <u>`dplyr::summarise()`</u>: ```r data_calcs %>% summarise( mean_mass = mean(`Body Mass (g)`), med_flipper = median(`Flipper Length (mm)`), max_culmen = max(`Culmen Length (mm)`)) ``` ``` ## # A tibble: 1 x 3 ## mean_mass med_flipper max_culmen ## <dbl> <dbl> <dbl> ## 1 4202. 197 59.6 ``` ] .pull-right[ <u>Base R</u> : ```r mean(data_calcs$`Body Mass (g)`) ``` ``` ## [1] 4201.754 ``` ```r median(data_calcs$`Flipper Length (mm)`) ``` ``` ## [1] 197 ``` ```r max(data_calcs$`Culmen Length (mm)`) ``` ``` ## [1] 59.6 ``` ] --- # Sommaire #### autres variantes de summarise(): > `summarise_if()` ```r dt <- data_calcs %>% group_by(Species) %>% summarise_if(is.numeric, list(maximum = max)) ``` <table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:right;"> Sample Number_maximum </th> <th style="text-align:right;"> Culmen Length (mm)_maximum </th> <th style="text-align:right;"> Culmen Depth (mm)_maximum </th> <th style="text-align:right;"> Flipper Length (mm)_maximum </th> <th style="text-align:right;"> Body Mass (g)_maximum </th> <th style="text-align:right;"> Delta 15 N (o/oo)_maximum </th> <th style="text-align:right;"> Delta 13 C (o/oo)_maximum </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:right;"> 152 </td> <td style="text-align:right;"> 46.0 </td> <td style="text-align:right;"> 21.5 </td> <td style="text-align:right;"> 210 </td> <td style="text-align:right;"> 4775 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> </tr> <tr> <td style="text-align:left;"> Chinstrap penguin (Pygoscelis antarctica) </td> <td style="text-align:right;"> 68 </td> <td style="text-align:right;"> 58.0 </td> <td style="text-align:right;"> 20.8 </td> <td style="text-align:right;"> 212 </td> <td style="text-align:right;"> 4800 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> -23.78767 </td> </tr> <tr> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:right;"> 124 </td> <td style="text-align:right;"> 59.6 </td> <td style="text-align:right;"> 17.3 </td> <td style="text-align:right;"> 231 </td> <td style="text-align:right;"> 6300 </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> </tr> </tbody> </table> Il y a aussi `summarise_at` et `summarise_all` --- class: inverse center middle # 🐧 Regrouper 🐧 --- # Regrouper ### group_by() & ungroup() > `group_by(.data, ..., .add = FALSE, .drop = TRUE)` > `ungroup(x, ...)` -- ```r dt <- data_penguin %>% group_by(Species) %>% summarize(Totals = n()) ``` <table class="table" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:right;"> Totals </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:right;"> 152 </td> </tr> <tr> <td style="text-align:left;"> Chinstrap penguin (Pygoscelis antarctica) </td> <td style="text-align:right;"> 68 </td> </tr> <tr> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:right;"> 124 </td> </tr> </tbody> </table> --- ```r dt <- data_calcs %>% group_by(Sex) %>% summarize(mean_mass = mean(`Body Mass (g)`)) ``` <table class="table" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> mean_mass </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 3862 </td> </tr> <tr> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 4546 </td> </tr> <tr> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 4006 </td> </tr> </tbody> </table> -- ```r dt <- data_calcs %>% group_by(Region, Island) %>% summarize(mean_mass = mean(`Body Mass (g)`)) ``` <table class="table" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:right;"> mean_mass </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:right;"> 4716 </td> </tr> <tr> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Dream </td> <td style="text-align:right;"> 3713 </td> </tr> <tr> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 3706 </td> </tr> </tbody> </table> --- class: center, middle ```r dt <- data_calcs %>% group_by(Species,Region, Island, Sex) %>% summarize(mean_mass = mean(`Body Mass (g)`)) ``` -- <table class="table" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> mean_mass </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 3369 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 4050 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Dream </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 3344 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Dream </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 4046 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Dream </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2975 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 3396 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 4035 </td> </tr> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 3681 </td> </tr> <tr> <td style="text-align:left;"> Chinstrap penguin (Pygoscelis antarctica) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Dream </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 3527 </td> </tr> <tr> <td style="text-align:left;"> Chinstrap penguin (Pygoscelis antarctica) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Dream </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 3939 </td> </tr> <tr> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 4680 </td> </tr> <tr> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 5485 </td> </tr> <tr> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 4588 </td> </tr> </tbody> </table> --- class: inverse center middle # 🐧 Joindre des *dataframes* 🐧 --- # Joindre des *dataframes* Il y a de plusieurs possibilités et façons de joindre des *dataframes* grâce à `dplyr`, en voici quelques unes: - par combinaison de variables ou d'observations: `bind_cols()` ou `bind_rows()` - par "données en commun": `mutate-joins` ou `filter-joins` -- On peut également faire des opérations sur ces *dataframes* pour vérifier les similarités et/ou différences <center><img src="images/join_operations.png" alt="Operations" width="400"/> --- # Joindre des *dataframes* Pour étudier quelques exemples de combinaison de *dataframes*, j'ai créé un *dataframe* nommé `data_random` qui contient 344 observations (comme nos données)et 2 variables. ```r data_random <- data.frame(random = replicate(1,sample(1:1000,344,rep=FALSE))) data_random %<>% bind_cols(id = data_penguin$`Individual ID`) ``` <center> <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> random </th> <th style="text-align:left;"> id </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 801 </td> <td style="text-align:left;"> N1A1 </td> </tr> <tr> <td style="text-align:right;"> 486 </td> <td style="text-align:left;"> N1A2 </td> </tr> <tr> <td style="text-align:right;"> 612 </td> <td style="text-align:left;"> N2A1 </td> </tr> <tr> <td style="text-align:right;"> 566 </td> <td style="text-align:left;"> N2A2 </td> </tr> <tr> <td style="text-align:right;"> 698 </td> <td style="text-align:left;"> N3A1 </td> </tr> <tr> <td style="text-align:right;"> 925 </td> <td style="text-align:left;"> N3A2 </td> </tr> </tbody> </table> *La colonne "id" correspond à la colonne "Individual ID" de `data_penguin`* --- ## Opérations ### intersect() > intersect() prend les colonnes de deux dataframes et compare si leurs rangées sont identiques ```r data_test <- intersect(data_penguin_clean$year, data_penguin_tidy$year) data_test2 <- intersect(data_random$id, data_penguin$`Individual ID`) ``` .pull-left[ <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> x </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:right;"> 2008 </td> </tr> <tr> <td style="text-align:right;"> 2009 </td> </tr> </tbody> </table> ] .pull-right[ <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> x </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> N1A1 </td> </tr> <tr> <td style="text-align:left;"> N1A2 </td> </tr> <tr> <td style="text-align:left;"> N2A1 </td> </tr> <tr> <td style="text-align:left;"> N2A2 </td> </tr> <tr> <td style="text-align:left;"> N3A1 </td> </tr> <tr> <td style="text-align:left;"> N3A2 </td> </tr> </tbody> </table> ] --- ## Opérations ### setdiff() > setdiff() prend les colonnes de deux dataframes et compare les différences entre leurs rangées. ```r data_test <- setdiff(data_penguin_clean$species, data_penguin_tidy$species) data_test2 <- setdiff(data_random$random, data_penguin$`Individual ID`) ``` .pull-left[ <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> x </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> </tr> <tr> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> </tr> <tr> <td style="text-align:left;"> Chinstrap penguin (Pygoscelis antarctica) </td> </tr> </tbody> </table> ] .pull-right[ <table class="table" style="font-size: 14px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> x </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 801 </td> </tr> <tr> <td style="text-align:right;"> 486 </td> </tr> <tr> <td style="text-align:right;"> 612 </td> </tr> <tr> <td style="text-align:right;"> 566 </td> </tr> <tr> <td style="text-align:right;"> 698 </td> </tr> <tr> <td style="text-align:right;"> 925 </td> </tr> </tbody> </table> ] --- ## Joindre des *dataframes* ### mutate-joins() .pull-left[ <center><img src="images/mutate-joins.png" alt="Operations" width="400"/> ] .pull-right[ La capture d'écran de *"Dplyr CheatSheet"* résume bien les effets des différents types de *join*. On va essayer de joindre les *dataframes* `data_random` et `data_penguin`. Rappel: les colonnes `id` et `Individual ID` des tableaux respectifs sont identiques. ] --- ## Une image vaut mille mots <center><img src="images/joins_explained.png" alt="inner_outer_joins" width="700"/> <center> Diagramme emprunté à SQL --- ### left-join() ```r joint_data_left <- left_join(data_random, data_penguin, by = c("id" = "Individual ID" )) ``` <table class="table" style="font-size: 10px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> random </th> <th style="text-align:left;"> id </th> <th style="text-align:left;"> studyName </th> <th style="text-align:right;"> Sample Number </th> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Stage </th> <th style="text-align:left;"> Clutch Completion </th> <th style="text-align:left;"> Date Egg </th> <th style="text-align:right;"> Culmen Length (mm) </th> <th style="text-align:right;"> Culmen Depth (mm) </th> <th style="text-align:right;"> Flipper Length (mm) </th> <th style="text-align:right;"> Body Mass (g) </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Delta 15 N (o/oo) </th> <th style="text-align:right;"> Delta 13 C (o/oo) </th> <th style="text-align:left;"> Comments </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 801 </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> </tr> <tr> <td style="text-align:right;"> 801 </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> PAL0910 </td> <td style="text-align:right;"> 81 </td> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2009-11-18 </td> <td style="text-align:right;"> 49.1 </td> <td style="text-align:right;"> 14.5 </td> <td style="text-align:right;"> 212 </td> <td style="text-align:right;"> 4625 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.35802 </td> <td style="text-align:right;"> -26.27660 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:right;"> 486 </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:right;"> 486 </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> PAL0910 </td> <td style="text-align:right;"> 82 </td> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2009-11-18 </td> <td style="text-align:right;"> 52.5 </td> <td style="text-align:right;"> 15.6 </td> <td style="text-align:right;"> 221 </td> <td style="text-align:right;"> 5450 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> 8.28601 </td> <td style="text-align:right;"> -26.27573 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:right;"> 612 </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> </tr> <tr> <td style="text-align:right;"> 612 </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> PAL0809 </td> <td style="text-align:right;"> 35 </td> <td style="text-align:left;"> Gentoo penguin (Pygoscelis papua) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Biscoe </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2008-11-13 </td> <td style="text-align:right;"> 49.1 </td> <td style="text-align:right;"> 14.8 </td> <td style="text-align:right;"> 220 </td> <td style="text-align:right;"> 5150 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 7.89744 </td> <td style="text-align:right;"> -26.63405 </td> <td style="text-align:left;"> NA </td> </tr> </tbody> </table> --- ### right-join() ```r joint_data_right <- right_join(data_penguin, data_random, by = c("Individual ID" = "id")) ``` <table class="table" style="font-size: 10px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> studyName </th> <th style="text-align:right;"> Sample Number </th> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Stage </th> <th style="text-align:left;"> Individual ID </th> <th style="text-align:left;"> Clutch Completion </th> <th style="text-align:left;"> Date Egg </th> <th style="text-align:right;"> Culmen Length (mm) </th> <th style="text-align:right;"> Culmen Depth (mm) </th> <th style="text-align:right;"> Flipper Length (mm) </th> <th style="text-align:right;"> Body Mass (g) </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Delta 15 N (o/oo) </th> <th style="text-align:right;"> Delta 13 C (o/oo) </th> <th style="text-align:left;"> Comments </th> <th style="text-align:right;"> random </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> <td style="text-align:right;"> 801 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 486 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 32 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 612 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 323 </td> </tr> </tbody> </table> --- ### full-join() ```r joint_data_full <- full_join(data_penguin, data_random, by = c("Individual ID" = "id")) ``` <table class="table" style="font-size: 10px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> studyName </th> <th style="text-align:right;"> Sample Number </th> <th style="text-align:left;"> Species </th> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> Island </th> <th style="text-align:left;"> Stage </th> <th style="text-align:left;"> Individual ID </th> <th style="text-align:left;"> Clutch Completion </th> <th style="text-align:left;"> Date Egg </th> <th style="text-align:right;"> Culmen Length (mm) </th> <th style="text-align:right;"> Culmen Depth (mm) </th> <th style="text-align:right;"> Flipper Length (mm) </th> <th style="text-align:right;"> Body Mass (g) </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Delta 15 N (o/oo) </th> <th style="text-align:right;"> Delta 13 C (o/oo) </th> <th style="text-align:left;"> Comments </th> <th style="text-align:right;"> random </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> <td style="text-align:right;"> 801 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> MALE </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> Not enough blood for isotopes. </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 486 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N1A2 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-11 </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.94956 </td> <td style="text-align:right;"> -24.69454 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 32 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 612 </td> </tr> <tr> <td style="text-align:left;"> PAL0708 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> Adelie Penguin (Pygoscelis adeliae) </td> <td style="text-align:left;"> Anvers </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:left;"> Adult, 1 Egg Stage </td> <td style="text-align:left;"> N2A1 </td> <td style="text-align:left;"> Yes </td> <td style="text-align:left;"> 2007-11-16 </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> FEMALE </td> <td style="text-align:right;"> 8.36821 </td> <td style="text-align:right;"> -25.33302 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 323 </td> </tr> </tbody> </table> --- class: center, middle # MERCI :) [**xaringan**](https://github.com/yihui/xaringan) <img src="images/merci_boku.png" alt="inner_outer_joins" width="400"/> --- ## Ressources: - [Cran R-project/Dplyr](https://cran.r-project.org/web/packages/dplyr/vignettes/base.html) - [R for Data Science](https://r4ds.had.co.nz/transform.html) - [Data Carpentry](https://datacarpentry.org/R-genomics/04-dplyr.html) - [Tidyverse/Dplyr](https://dplyr.tidyverse.org/index.html)