class: title-slide, center, middle <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.0/css/all.css" integrity="sha384-aOkxzJ5uQz7WBObEZcHvV5JvRW3TUc2rNPA7pe3AwnsUohiw1Vj2Rgx2KSOkF5+h" crossorigin="anonymous"> <style> .center2 { margin: 0; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } .rcorners1 { margin: auto; border-radius: 25px; background: #ada500; padding: 10px; # width: 50%; } </style> <style type="text/css"> .right-column{ padding-top: 0; } .remark-code, .remark-inline-code { font-family: 'Source Code Pro', 'Lucida Console', Monaco, monospace; font-size: 90%; } </style> <div class="my-logo-left"> <img src="img/UA-eng-hor-1-RGB.jpg" width="110%"/> </div> <div class="my-logo-right"> <img src="img/logo_VLHORA.svg" width="110%"/> </div> # INPUT - OUTPUT Workshop R & RStudio .font160[ .SW-greenD[Deel 3] ] .font120[ .SW-greenD[*Data manipulatie met*] .UA-red[*`dplyr`*] ] Sven De Maeyer .font80[ .UA-red[ 22/04/2022 ] ] --- class: inverse-green, left # Overzicht .center2[ - Tidyverse --- ([doorklikken](#part1)) - Het `dplyr` pakket --- ([doorklikken](#part2)) - Implementatie --- ([doorklikken](#part3)) - Enkele geavanceerdere voorbeelden --- ([doorklikken](#part4)) ] --- class: inverse-green, center, middle name: part1 # 1. Tidyverse --- ## Welkom in het .UA-red[`tidyverse`] .center2[ <img src="tidyverse_data_science.png" width="100%" height="100%" /> ] --- ## Waarom .UA-red[`tidyverse`]? - handig voor beginners - consistente benadering voor alles - krachtige mogelijkhede met een minimum aan 'effort' - geeft vertrouwen om `R` verder te exploreren --- ## Tibble In `R` werken we normaal met een .SW-greenD[dataframe]. Binnen het `tidyverse` ecosysteem werken we met een variant: een `tibble` Een tibble is eigenlijk een dataframe volgens het **tidy data** principe .footnotesize[ ```r RIASEC ``` ``` ## # A tibble: 6,578 × 100 ## R1 R2 R3 R4 R5 R6 R7 R8 I1 I2 I3 I4 I5 ## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1 1 1 1 1 1 1 1 2 4 2 2 1 ## 2 1 1 1 1 1 1 1 1 4 2 3 2 3 ## 3 5 3 1 1 1 1 2 2 4 4 4 2 4 ## 4 1 2 1 2 2 3 2 2 4 5 4 4 4 ## 5 1 1 5 1 1 2 1 1 4 4 4 4 4 ## 6 3 1 1 2 1 2 2 3 3 4 4 2 1 ## 7 1 1 1 1 1 1 1 1 3 4 3 1 1 ## 8 5 1 1 4 5 1 3 3 3 2 4 4 4 ## 9 1 1 1 1 1 1 1 1 3 4 2 3 2 ## 10 5 4 2 4 2 3 3 3 5 5 2 5 2 ## # … with 6,568 more rows, and 87 more variables: I6 <dbl>, I7 <dbl>, I8 <dbl>, ## # A1 <dbl>, A2 <dbl>, A3 <dbl>, A4 <dbl>, A5 <dbl>, A6 <dbl>, A7 <dbl>, ## # A8 <dbl>, S1 <dbl>, S2 <dbl>, S3 <dbl>, S4 <dbl>, S5 <dbl>, S6 <dbl>, ## # S7 <dbl>, S8 <dbl>, E1 <dbl>, E2 <dbl>, E3 <dbl>, E4 <dbl>, E5 <dbl>, ## # E6 <dbl>, E7 <dbl>, E8 <dbl>, C1 <dbl>, C2 <dbl>, C3 <dbl>, C4 <dbl>, ## # C5 <dbl>, C6 <dbl>, C7 <dbl>, C8 <dbl>, introelapse <dbl>, ## # testelapse <dbl>, surveyelapse <dbl>, TIPI1 <dbl>, TIPI2 <dbl>, … ``` ] --- ## Wat is **tidy data**? <img src="tidydata_1.jpeg" width="80%" height="80%" /> <p align="right">.footnotesize[.SW-greenD[*Artwork by @allison_horst*]] </p> --- ## Wat is **tidy data**? <img src="tidydata_2.jpeg" width="80%" height="80%" /> <p align="right">.footnotesize[.SW-greenD[*Artwork by @allison_horst*]] </p> --- ## Wat is **tidy data**? <img src="tidydata_3.jpeg" width="80%" height="80%" /> <p align="right">.footnotesize[.SW-greenD[*Artwork by @allison_horst*]] </p> --- class: inverse-green, center, middle name: part2 # 2. Het .UA-red[`dplyr`] pakket --- ## .UA-red[`dplyr`] ... .Large[is HET pakket om te werken met tidy data !] <br> <br> .SW-greenD[**WERKWOORDEN**] staan centraal: - `filter()` - `mutate()` - `select()` - `group_by() + summarise()` - `arrange()` - `rename()` - `relocate()` - `join()` --- <img src="dplyr_cheatsheet.jpg" width="60%" height="60%" /> https://raw.githubusercontent.com/rstudio/cheatsheets/master/data-transformation.pdf --- ## De .UA-red[`%>%`] operator (een 'pipe') .left-column[ <img src="magrittr_stxndz.png" width="100%" height="100%" /> <br> <p align="center">Om functies <br>.SW-greenD[**aaneen te schakelen**] </p> ] .right-column[ In plaats van ```r mean(c(1,2,3,4)) ``` of ```r Getallen <- c(1,2,3,4) mean(Getallen) ``` doe je ```r c(1,2,3,4) %>% mean( ) ``` Met de `%>%` kan je volgende zin schrijven: > *I .UA-red[`%>%`] woke up .UA-red[`%>%`] took a shower .UA-red[`%>%`] got breakfast .UA-red[`%>%`] took the metro .UA-red[`%>%`] arrived at work .UA-red[`%>%`] …* ] --- ## .UA-red[`filter()`] <img src="dplyr_filter.jpeg" width="70%" height="70%" /> <p align="right">.footnotesize[.SW-greenD[*Artwork by @allison_horst*]] </p> --- ## .UA-red[`filter()`] toegepast Met de RIASEC data: > .SW-greenD[*We selecteren enkel observaties van mannen uit GB*] ```r RIASEC_UK_Male <- RIASEC %>% filter(country == "GB" & gender == 1) ``` .UA-red[`==`] staat voor *is gelijk aan* (let op de 2 = tekens!) > .SW-greenD[*We cleanen de data en weerhouden enkel observaties waarvoor de leeftijd lager is dan 110 en gender niet de onmogelijke code 0 heeft*] ```r RIASEC_clean <- RIASEC %>% filter(age < 110 $ gender != 0) ``` .UA-red[`!=`] staat voor *is niet gelijk aan* --- ## .UA-red[`mutate()`] <img src="dplyr_mutate.png" width="50%" height="50%" /> <p align="right">.footnotesize[.SW-greenD[*Artwork by @allison_horst*]] </p> --- ## .UA-red[`mutate()`] toegepast Met de RIASEC data: > .SW-greenD[*We berekenen scores voor de 6 kerndimensies van het RIASEC model en overschrijven de RIASEC dataset (zo hebben we de kolommen toegevoegd aan de dataset)*] ```r RIASEC <- RIASEC %>% mutate( Realistic = (R1 + R2 + R3 + R4 + R5 + R6 + R7 + R8)/8, Investigative = (I1 + I2 + I3 + I4 + I5 + I6 + I7 + I8)/8, Artistic = (A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8)/8, Social = (S1 + S2 + S3 + S4 + S5 + S6 + S7 + S8)/8, Enterprising = (E1 + E2 + E3 + E4 + E5 + E6 + E7 + E8)/8, Conventional = (C1 + C2 + C3 + C4 + C5 + C6 + C7 + C8)/8 ) ``` --- ## .UA-red[`mutate()`] toegepast Met de RIASEC data: > .SW-greenD[*We zetten de variabele land om in een factor*] ```r RIASEC <- RIASEC %>% mutate( country_factor = as.factor(country) ) str(RIASEC$country_factor) ``` ``` ## Factor w/ 3 levels "BE","GB","NL": 3 2 2 2 2 2 1 1 2 2 ... ``` --- ## .UA-red[`select()`] toegepast Aangeven welke variabelen je wenst te selecteren. Enkele voorbeelden met de RIASEC data: > .SW-greenD[*We selecteren enkel `country`, `age`, `gender` en dan tonen we de structuur via `str()`*] .footnotesize[ ```r RIASEC %>% select( country, age, gender ) %>% str() ``` ``` ## tibble [6,578 × 3] (S3: tbl_df/tbl/data.frame) ## $ country: chr [1:6578] "NL" "GB" "GB" "GB" ... ## $ age : num [1:6578] 46 21 20 41 22 34 28 20 52 30 ... ## $ gender : num [1:6578] 2 2 1 2 1 2 2 1 2 1 ... ``` ] --- ## .UA-red[`select()`] toegepast > .SW-greenD[*We selecteren enkel `country`, `age`, `gender`, en de nieuw berekende variabelen (Realistic tot en met Conventional) en dan tonen we de structuur via `str()`* ] .footnotesize[ ```r RIASEC %>% select( country, age, gender, Realistic:Conventional ) %>% str() ``` ``` ## tibble [6,578 × 9] (S3: tbl_df/tbl/data.frame) ## $ country : chr [1:6578] "NL" "GB" "GB" "GB" ... ## $ age : num [1:6578] 46 21 20 41 22 34 28 20 52 30 ... ## $ gender : num [1:6578] 2 2 1 2 1 2 2 1 2 1 ... ## $ Realistic : num [1:6578] 1 1 2 1.88 1.62 ... ## $ Investigative: num [1:6578] 2.25 2.5 3.5 3.88 4 ... ## $ Artistic : num [1:6578] 3.88 4.12 1.62 4 2.62 ... ## $ Social : num [1:6578] 3.62 3.38 1.5 4.25 1 ... ## $ Enterprising : num [1:6578] 1.25 1.5 1.38 2.38 1.75 ... ## $ Conventional : num [1:6578] 1 1 3.5 1.25 1.5 ... ``` ] --- ## Power combinatie 1: .UA-red[`group_by() + summarize( )`] - `group_by()` zet een tibble om naar een 'gegroepeerde tibble' waarbij alle bewerkingen op groepsniveau gebeuren - `summarize()` om per groep zaken te berekenen > .SW-greenD[*Per land berekenen we de gemiddelde leeftijd en de standaardafwijking* ] .footnotesize[ ```r RIASEC %>% group_by( country ) %>% summarize( mean_age = mean(age), sd_age = sd(age) ) ``` ``` ## # A tibble: 3 × 3 ## country mean_age sd_age ## <chr> <dbl> <dbl> ## 1 BE 28.8 10.6 ## 2 GB 34.3 18.9 ## 3 NL 29.2 11.9 ``` ] --- ## Power combinatie 1: .UA-red[`group_by() + summarize( )`] > .SW-greenD[*Per combinatie van land en gender berekenen we de gemiddelde leeftijd en de standaardafwijking* ] .footnotesize[ ```r RIASEC %>% group_by( country, gender ) %>% summarize( mean_age = mean(age), sd_age = sd(age) ) ``` ``` ## # A tibble: 11 × 4 ## # Groups: country [3] ## country gender mean_age sd_age ## <chr> <dbl> <dbl> <dbl> ## 1 BE 0 24 NA ## 2 BE 1 30.8 11.7 ## 3 BE 2 27.8 9.77 ## 4 BE 3 21.7 4.73 ## 5 GB 0 45 19.5 ## 6 GB 1 36.5 14.0 ## 7 GB 2 32.8 13.3 ## 8 GB 3 49.3 151. ## 9 NL 1 31.3 12.6 ## 10 NL 2 28.0 11.2 ## 11 NL 3 19.1 3.85 ``` ] --- ## Power combinatie 2: .UA-red[`mutate() + case_when( )`] <img src="dplyr_case_when_sm.png" width="70%" height="70%" /> <p align="right">.footnotesize[.SW-greenD[*Artwork by @allison_horst*]] </p> --- ## Power combinatie 2: .UA-red[`mutate() + case_when( )`] .pull-left[ > .SW-greenD[*We maken een nieuwe variabele `age_group` met 3 groepen, vervolgens selecteren we enkel de `age` en `age_group` om vervolgens enkel de bovenste 5 observaties te tonen...* ]] .pull-right[ .footnotesize[ ```r RIASEC %>% mutate( age_group = case_when( age < 19 ~ 'minderjarig', age >= 18 & age < 67 ~ 'actieve bevolking', age >= 67 ~ 'gepensioneerd' ) ) %>% select( age, age_group ) %>% head(5) ``` ``` ## # A tibble: 5 × 2 ## age age_group ## <dbl> <chr> ## 1 46 actieve bevolking ## 2 21 actieve bevolking ## 3 20 actieve bevolking ## 4 41 actieve bevolking ## 5 22 actieve bevolking ``` ] ] --- ## Condities definiëren - .UA-red[`x == y`] `\(\rightarrow\)` 'x is gelijk aan y' - .UA-red[`x != y` ] `\(\rightarrow\)` 'x is NIET gelijk aan y' - .UA-red[`x < y`] `\(\rightarrow\)` 'x is kleiner dan y' - .UA-red[`x <= y`] `\(\rightarrow\)` 'x is kleiner dan of gelijk aan y' - .UA-red[`x > y`] `\(\rightarrow\)` 'x is groter dan y' - .UA-red[`x >= y`] `\(\rightarrow\)` 'x is groter dan of gelijk aan y' --- ## Boleaanse operatoren Handig om weten is dat je condities kan combineren! - .UA-red[`&`] `\(\rightarrow\)` 'en' `\(\rightarrow\)` bv: `gender == 1 & age <=18` - .UA-red[`|`] `\(\rightarrow\)` 'of' `\(\rightarrow\)` bv: `gender == 1 | gender == 2` - .UA-red[`!`] `\(\rightarrow\)` 'niet' `\(\rightarrow\)` bv: `gender == 1 & !age <=18` --- ## Interactieve tutorial over .UA-red[`dplyr()`] Wil je wat referentiemateriaal en een plek om je skills te oefenen? Deze tutorial (gemaakt met het pakket `learnr`) is een echte aanrader! <img src="Interactive_tutorial_dplyr.jpg" width="50%" height="50%" /> https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome --- class: inverse-blue # <i class="fas fa-laptop-code" style="color: #FF0035;"></i> Oefening `dplyr` .left-column[  ] .right-column[ - Op Dropbox vind je een document .SW-greenD[ `Oefening_dplyr.Rmd`] - Plaats dit document in de .SW-greenD[`RIASEC_project/Output`] map op je pc - Open vervolgens het bestand binnen je R project - Het document bevat een set van opdrachten met telkens lege code blokken - Bedoeling is dat je de juiste code schrijft (en test door te laten lopen) om deze opdrachten uit te voeren - Zit je vast? No Worries! - Ik ben er - Je hebt elkaar - Er is een oplossingssleutel .SW-greenD[`Oefening_dplyr_oplossing.Rmd`] ]