class: center, middle, inverse, title-slide # Wrangling ### Explorative Datenanalyse mit R
The R Bootcamp
### September 2020 --- layout: true <div class="my-footer"> <span style="text-align:center"> <span> <img src="https://raw.githubusercontent.com/therbootcamp/therbootcamp.github.io/master/_sessions/_image/by-sa.png" height=14 style="vertical-align: middle"/> </span> <a href="https://therbootcamp.github.io/"> <span style="padding-left:82px"> <font color="#7E7E7E"> www.therbootcamp.com </font> </span> </a> <a href="https://therbootcamp.github.io/"> <font color="#7E7E7E"> Explorative Datenanalyse mit R | September 2020 </font> </a> </span> </div> --- <!--- # Was ist <i>Wrangling</i>? <p align = "center"> <img src="image/wrangling.jpeg" height=450px><br> <font style="font-size:10px">from <a href="https://datasciencebe.com/tag/data-wrangling/">datasciencebe.com</a></font> </p> ---> .pull-left45[ # Was ist Wrangling? <ul> <li class="m1"><span><high>Transformieren</high> <br><br> <ul class="level"> <li><span>Spaltennamen verändern</span></li> <li><span>Neue Variablen kreieren</span></li> </ul></span></li> <li class="m2"><span><high>Organisieren</high> <br><br> <ul class="level"> <li><span>Sortieren</span></li> <li><span>Datensätze zusammenführen</span></li> <li><span>Spalten zu Zeilen flippen</span></li> </ul></span></li> <li class="m3"><span><high>Aggregieren</high> <br><br> <ul class="level"> <li><span>Datengruppen bilden</span></li> <li><span>Statistiken für Gruppen berechnen</span></li> </ul></span></li> </ul> ] .pull-right5[ <br> <p align="center"> <img src="image/wrangling.png" height = "530px"> </p> ] --- .pull-left4[ # 2 'dreckige' Datensätze <ul> <li class="m1"><span><high>Umbenennen</high>: Intuitive Spaltennamen vergeben.</span></li> <li class="m2"><span><high>Umkodieren</high>: Angemessene Einheiten und Datenlabels vergeben.</span></li> <li class="m3"><span><high>Verbinden</high>: Datensätze zusammenführen.</span></li> <li class="m4"><span><high>Sortieren</high>: Datensatz ordnen.</span></li> <li class="m5"><span><high>Filtern</high>: Relevante Fälle auswählen.</span></li> <li class="m6"><span><high>Auswählen</high>: Relevante Variablen auswählen.</span></li> </ul> ] .pull-right45[ <br> ```r patienten ``` ``` ## # A tibble: 5 x 3 ## id X1 X2 ## <dbl> <dbl> <dbl> ## 1 1 37 1 ## 2 2 65 2 ## 3 3 57 2 ## 4 4 34 1 ## 5 5 45 2 ``` ```r ergebnisse ``` ``` ## # A tibble: 5 x 3 ## id t_1 t_2 ## <dbl> <dbl> <dbl> ## 1 4 100 105 ## 2 92 134 150 ## 3 1 123 135 ## 4 2 143 140 ## 5 99 102 68 ``` ] --- # Das mächtige <mono>tidyverse</mono> <ul> <li class="m1"><span>Das <a href="https://www.tidyverse.org/"><mono>tidyverse</mono></a> ist im Kern eine Sammlung hoch-performanter, nutzerfreundlicher Pakete, die speziell für eine effizientere Datenanalyse entwickelt wurden.</span></li> </ul> <ol style="padding-left:72px"> <li><mono>ggplot2</mono> für Grafiken.</li> <li><high><mono>dplyr</mono> für Datenverarbeitung</high>.</li> <li><high><mono>tidyr</mono> für Datenverarbeitung</high>.</li> <li><mono>readr</mono> für Daten I/O.</li> <li><mono>purrr</mono> für funktionales Programmieren.</li> <li><mono>tibble</mono> für moderne <mono>data_frame</mono>'s.</li> </ol> <table style="cellspacing:0; cellpadding:0; border:none;padding-top:20px"> <col width="15%"> <col width="15%"> <col width="15%"> <col width="15%"> <col width="15%"> <col width="15%"> <tr> <td bgcolor="white"> <img src="image/hex-ggplot2.png" height=160px style="opacity:.2"></img> </td> <td bgcolor="white"> <img src="image/hex-dplyr.png"height=160px></img> </td> <td bgcolor="white"> <img src="image/hex-tidyr.png"height=160px></img> </td> <td bgcolor="white"> <img src="image/hex-readr.png"height=160px style="opacity:.2"></img> </td> <td bgcolor="white"> <img src="image/hex-purrr.png"height=160px style="opacity:.2"></img> </td> <td bgcolor="white"> <img src="image/hex-tibble.png"height=160px style="opacity:.2"></img> </td> </tr> </table> --- # <mono>%>%</mono> .pull-left45[ <ul> <li class="m1"><span>Der präferierte Gebrauch von <mono>dplyr</mono> beinhaltet einen <high>neuen Operator</high>, die Pipe <highm>%>%</highm>.</span></li> </ul> <br> <p align="center"> <img src="image/pipe.jpg" width = "300px"><br> <font style="font-size:10px">from <a href="https://upload.wikimedia.org/wikipedia/en/thumb/b/b9/MagrittePipe.jpg">wikimedia.org</a></font> </p> ] .pull-right45[ ```r # Numerischer Vektor score <- c(8, 4, 6, 3, 7, 3) score ``` ``` ## [1] 8 4 6 3 7 3 ``` ```r # Mittelwert: Base-R-style mean(score) ``` ``` ## [1] 5.167 ``` ```r # Mittelwert: dplyr-style score %>% mean() ``` ``` ## [1] 5.167 ``` ] --- # <mono>%>%</mono> .pull-left45[ <ul> <li class="m1"><span>Der präferierte Gebrauch von <mono>dplyr</mono> beinhaltet einen <high>neuen Operator</high>, die Pipe <highm>%>%</highm>.</span></li> </ul> <br> <p align="center"> <img src="image/pipe.jpg" width = "300px"><br> <font style="font-size:10px">from <a href="https://upload.wikimedia.org/wikipedia/en/thumb/b/b9/MagrittePipe.jpg">wikimedia.org</a></font> </p> ] .pull-right45[ <p align="center"> <img src="image/pipe.png" height = "400px"> </p> ] --- .pull-left4[ # Transformation <ul> <li class="m1"><span><high>Umbenennen</high>: Intuitive Spaltennamen vergeben. <br><br> <ul class="level"> <li><span><mono>rename()</mono></span></li> </ul> </span></li> <li class="m2"><span><high>Umkodieren</high>: Angemessene Einheiten und Datenlabels vergeben. <br><br> <ul class="level"> <li><span><mono>mutate()</mono></span></li> <li><span><mono>case_when()</mono></span></li> </ul> </span></li> <li class="m3"><span><high>Verbinden</high>: Datensätze zusammenführen. <br><br> <ul class="level"> <li><span><mono>left_join()</mono></span></li> </ul> </span></li> </ul> ] .pull-right45[ <br> ```r patienten ``` ``` ## # A tibble: 5 x 3 ## id X1 X2 ## <dbl> <dbl> <dbl> ## 1 1 37 1 ## 2 2 65 2 ## 3 3 57 2 ## 4 4 34 1 ## 5 5 45 2 ``` ```r ergebnisse ``` ``` ## # A tibble: 5 x 3 ## id t_1 t_2 ## <dbl> <dbl> <dbl> ## 1 4 100 105 ## 2 92 134 150 ## 3 1 123 135 ## 4 2 143 140 ## 5 99 102 68 ``` ] --- # `rename()` .pull-left45[ ```r patienten %>% rename(NEU = ALT, NEU = ALT) ``` ] .pull-right45[ ```r # Starte mit Datensatz patienten %>% # Ändere Spaltennamen rename(alter = X1, bedingung = X2) ``` ``` ## # A tibble: 5 x 3 ## id alter bedingung ## <dbl> <dbl> <dbl> ## 1 1 37 1 ## 2 2 65 2 ## 3 3 57 2 ## 4 4 34 1 ## 5 5 45 2 ``` ] --- # `mutate()` .pull-left45[ ```r tibble %>% mutate( NAME1 = DEFINITION1, NAME2 = DEFINITION2, NAME3 = DEFINITION3, ... ) ``` ] .pull-right45[ ```r patienten %>% rename(alter = X1, bedingung = X2) %>% # Kreiere neue Variablen mutate(monate = alter * 12, dekaden = alter / 10) ``` ``` ## # A tibble: 5 x 5 ## id alter bedingung monate dekaden ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1 37 1 444 3.7 ## 2 2 65 2 780 6.5 ## 3 3 57 2 684 5.7 ## 4 4 34 1 408 3.4 ## 5 5 45 2 540 4.5 ``` ] --- # `case_when()` .pull-left45[ ```r tibble %>% mutate( NAME = case_when( LOGICAL1 ~ WERT1, LOGICAL2 ~ WERT2, ... ) ) ``` ] .pull-right45[ ```r patienten %>% rename(alter = X1, bedingung = X2) %>% # Kreiere bed_label von bedingung mutate(bed_label = case_when( bedingung == 1 ~ "placebo", bedingung == 2 ~ "medikament")) ``` ``` ## # A tibble: 5 x 4 ## id alter bedingung bed_label ## <dbl> <dbl> <dbl> <chr> ## 1 1 37 1 placebo ## 2 2 65 2 medikament ## 3 3 57 2 medikament ## 4 4 34 1 placebo ## 5 5 45 2 medikament ``` ] --- # Verbinde Daten <p align="center"> <img src="image/joining_data.png" height="450px"> </p> --- # `inner_join()` .pull-left4[ ```r TIBBLE1 %>% inner_join(TIBBLE2, by = c("KEY")) ``` ] .pull-right5[ ```r patienten %>% rename(alter = X1, bedingung = X2) %>% mutate(bed_label = case_when( bedingung == 1 ~ "placebo", bedingung == 2 ~ "medikament")) %>% # Verbinde mit ergebnisse inner_join(ergebnisse, by = "id") ``` ``` ## # A tibble: 3 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 1 37 1 placebo 123 135 ## 2 2 65 2 medikament 143 140 ## 3 4 34 1 placebo 100 105 ``` ] --- # `left_join()` .pull-left4[ ```r TIBBLE1 %>% left_join(TIBBLE2, by = c("KEY")) ``` ] .pull-right5[ ```r patienten %>% rename(alter = X1, bedingung = X2) %>% mutate(bed_label = case_when( bedingung == 1 ~ "placebo", bedingung == 2 ~ "medikament")) %>% # Verbinde mit ergebnisse left_join(ergebnisse, by = "id") ``` ``` ## # A tibble: 5 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 1 37 1 placebo 123 135 ## 2 2 65 2 medikament 143 140 ## 3 3 57 2 medikament NA NA ## 4 4 34 1 placebo 100 105 ## 5 5 45 2 medikament NA NA ``` ] --- # Organisation .pull-left4[ <ul> <li class="m4"><span><high>Sortieren</high>: Datensatz ordnen. <br><br> <ul class="level"> <li><span><mono>arrange()</mono></span></li> </ul> </span></li> <li class="m5"><span><high>Filtern</high>: Relevante Fälle auswählen. <br><br> <ul class="level"> <li><span><mono>slice()</mono></span></li> <li><span><mono>filter()</mono></span></li> </ul> </span></li> <li class="m6"><span><high>Auswählen</high>: Relevante Variablen auswählen. <br><br> <ul class="level"> <li><span><mono>select()</mono></span></li> </ul> </span></li> </ul> ] .pull-right55[ ```r # Verbundener tibble patienten_ergebnisse ``` ``` ## # A tibble: 5 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 1 37 1 placebo 123 135 ## 2 2 65 2 medikament 143 140 ## 3 3 57 2 medikament NA NA ## 4 4 34 1 placebo 100 105 ## 5 5 45 2 medikament NA NA ``` ] --- # `arrange()` .pull-left4[ ```r # Sortiere aufsteigend tibble %>% arrange(VAR1, VAR2) # Sortiere absteigend (mit desc()) tibble %>% arrange(desc(VAR1), VAR2) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% # Sortiere nach bedingung arrange(bedingung) ``` ``` ## # A tibble: 5 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 1 37 1 placebo 123 135 ## 2 4 34 1 placebo 100 105 ## 3 2 65 2 medikament 143 140 ## 4 3 57 2 medikament NA NA ## 5 5 45 2 medikament NA NA ``` ] --- # `arrange()` .pull-left4[ ```r # Sortiere aufsteigend tibble %>% arrange(VAR1, VAR2) # Sortiere absteigend (mit desc()) tibble %>% arrange(desc(VAR1), VAR2) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% # Sortiere nach beidem arrange(bedingung, alter) ``` ``` ## # A tibble: 5 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 4 34 1 placebo 100 105 ## 2 1 37 1 placebo 123 135 ## 3 5 45 2 medikament NA NA ## 4 3 57 2 medikament NA NA ## 5 2 65 2 medikament 143 140 ``` ] --- # `slice()` .pull-left4[ ```r # Slice mit Sequenz patienten_ergebnisse %>% slice(INDEX_START:INDEX_STOP) # Slice mit Vektor patienten_ergebnisse %>% slice(c(INDEX1, INDEX2, ...)) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% arrange(bedingung, alter) %>% # Zeilen 3 und 5 slice(c(3, 5)) ``` ``` ## # A tibble: 2 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 5 45 2 medikament NA NA ## 2 2 65 2 medikament 143 140 ``` ] --- # `slice()` .pull-left4[ ```r # Slice mit Sequenz patienten_ergebnisse %>% slice(INDEX_START:INDEX_STOP) # Slice mit Vektor patienten_ergebnisse %>% slice(c(INDEX1, INDEX2, ...)) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% arrange(bedingung, alter) %>% # Erste 4 Zeilen slice(1:4) ``` ``` ## # A tibble: 4 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 4 34 1 placebo 100 105 ## 2 1 37 1 placebo 123 135 ## 3 5 45 2 medikament NA NA ## 4 3 57 2 medikament NA NA ``` ] --- # `filter()` .pull-left4[ ```r patienten_ergebnisse %>% filter(VAR1 == WERT1, VAR2 > WERT2, VAR3 < WERT3, VAR4 == WERT4 | VAR5 < WERT5) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% # Patienten mit alter > 35 filter(alter > 35) ``` ``` ## # A tibble: 4 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 1 37 1 placebo 123 135 ## 2 2 65 2 medikament 143 140 ## 3 3 57 2 medikament NA NA ## 4 5 45 2 medikament NA NA ``` ] --- # `filter()` .pull-left4[ ```r patienten_ergebnisse %>% filter(VAR1 == WERT1, VAR2 > WERT2, VAR3 < WERT3, VAR4 == WERT4 | VAR5 < WERT5) ``` ] .pull-right5[ ```r # alter grösser 35 & bed_label ist medikament patienten_ergebnisse %>% filter(alter > 35, bed_label == "medikament") ``` ``` ## # A tibble: 3 x 6 ## id alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> ## 1 2 65 2 medikament 143 140 ## 2 3 57 2 medikament NA NA ## 3 5 45 2 medikament NA NA ``` ] --- # `select()` .pull-left4[ ```r # Wähle Variablen A und B aus tibble %>% select(VAR1, VAR2) # Wähle alles ausser A aus tibble %>% select(-VAR1) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% # Wähle id und bedingung aus select(id, bedingung) ``` ``` ## # A tibble: 5 x 2 ## id bedingung ## <dbl> <dbl> ## 1 1 1 ## 2 2 2 ## 3 3 2 ## 4 4 1 ## 5 5 2 ``` ] --- # `select()` .pull-left4[ ```r # Wähle Variablen A und B aus tibble %>% select(VAR1, VAR2) # Wähle alles ausser A aus tibble %>% select(-VAR1) ``` ] .pull-right5[ ```r patienten_ergebnisse %>% # Alles ausser id select(-id) ``` ``` ## # A tibble: 5 x 5 ## alter bedingung bed_label t_1 t_2 ## <dbl> <dbl> <chr> <dbl> <dbl> ## 1 37 1 placebo 123 135 ## 2 65 2 medikament 143 140 ## 3 57 2 medikament NA NA ## 4 34 1 placebo 100 105 ## 5 45 2 medikament NA NA ``` ] --- class: middle, center <h1><a href="https://therbootcamp.github.io/EDA_2020Sep/_sessions/Wrangling/Wrangling_practical.html">Practical</a></h1>