class: title-slide <script async defer data-domain="rstatszh.github.io/website" src="https://plausible.io/js/plausible.js"></script> # rstatsZH - Data Science mit R ## Mit mehreren Dataframes arbeiten / Funktionen schreiben .bottom[
Lars Schöbitz
2023-10-19
] --- # Rückblick - Woche 6 - Erweiterte Vektoren - Faktoren - Datumswerte - Daten importieren - `read_csv()` - Tidy Data Konzept - Daten drehen (pivoting) mit `{tidyr}` - `pivot_longer()` - `pivot_wider()` --- background-image: url(img/questions.jpg) background-size: contain background-position: right class: middle # .large[Hausaufgabe 6] --- # Hausaufgabe 6 - Datenschutz 1. Unterordner für Daten erstellen 2. Daten in diesem Ordner speichern <img src="img/github-to-project-local.004.png" width="80%" style="display: block; margin: auto;" /> --- # Hausaufgabe 6 - Datenschutz 1. `.gitignore` Datei öffnen 2. Neue Zeile hinzufügen mit Text `/data` <img src="img/github-to-project-local.005.png" width="90%" style="display: block; margin: auto;" /> --- # Ziele für diese Woche Am Ende dieser Woche könnt ihr: - Mehrere Dataframes zusammenfügen - Tabellen mit verschiedenen Packages darstellen - **Bonusmaterial:** Eine eigene Funktion schreiben - Mit den im Kurs erlernten Fähigkeiten selbstständig weiter arbeiten --- class: middle, inverse # .large[Mit mehreren Dataframes arbeiten] --- class: middle # .hand[Wir...] .huge[.green[haben]] .hand[mehrere Dataframes] .huge[.pink[wollen]] .hand[diese zusammenbringen] --- ## Data: Women in science Informationen zu 10 Frauen in der Wissenschaft welche die Welt verändert haben .small[ <table> <thead> <tr> <th style="text-align:left;"> name </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Ada Lovelace </td> </tr> <tr> <td style="text-align:left;"> Marie Curie </td> </tr> <tr> <td style="text-align:left;"> Janaki Ammal </td> </tr> <tr> <td style="text-align:left;"> Chien-Shiung Wu </td> </tr> <tr> <td style="text-align:left;"> Katherine Johnson </td> </tr> <tr> <td style="text-align:left;"> Rosalind Franklin </td> </tr> <tr> <td style="text-align:left;"> Vera Rubin </td> </tr> <tr> <td style="text-align:left;"> Gladys West </td> </tr> <tr> <td style="text-align:left;"> Flossie Wong-Staal </td> </tr> <tr> <td style="text-align:left;"> Jennifer Doudna </td> </tr> </tbody> </table> ] .footnote[ Quelle: [Discover Magazine](https://www.discovermagazine.com/the-sciences/meet-10-women-in-science-who-changed-the-world) ] ??? Daten kommen aus dem Discover Magazine. Daten aus dem Artikel herausgeholt. --- ## Inputs - Drei Dataframes .panelset[ .panel[.panel-name[professions] ``` # A tibble: 10 × 2 name profession <chr> <chr> 1 Ada Lovelace Mathematician 2 Marie Curie Physicist and Chemist 3 Janaki Ammal Botanist 4 Chien-Shiung Wu Physicist 5 Katherine Johnson Mathematician 6 Rosalind Franklin Chemist 7 Vera Rubin Astronomer 8 Gladys West Mathematician 9 Flossie Wong-Staal Virologist and Molecular Biologist 10 Jennifer Doudna Biochemist ``` ] .panel[.panel-name[dates] ``` # A tibble: 8 × 3 name birth_year death_year <chr> <dbl> <dbl> 1 Janaki Ammal 1897 1984 2 Chien-Shiung Wu 1912 1997 3 Katherine Johnson 1918 2020 4 Rosalind Franklin 1920 1958 5 Vera Rubin 1928 2016 6 Gladys West 1930 NA 7 Flossie Wong-Staal 1947 NA 8 Jennifer Doudna 1964 NA ``` ] .panel[.panel-name[works] ``` # A tibble: 9 × 2 name known_for <chr> <chr> 1 Ada Lovelace first computer algorithm 2 Marie Curie theory of radioactivity, discovery of elem… 3 Janaki Ammal hybrid species, biodiversity protection 4 Chien-Shiung Wu confim and refine theory of radioactive bet… 5 Katherine Johnson calculations of orbital mechanics critical … 6 Vera Rubin existence of dark matter 7 Gladys West mathematical modeling of the shape of the E… 8 Flossie Wong-Staal first scientist to clone HIV and create a m… 9 Jennifer Doudna one of the primary developers of CRISPR, a … ``` ] ] ??? .small[ **Professions** Hier sehen wir die berufsbezeichungen der 10 Wissenschatfler_innen welche in dem Artikelk auftauchen. So haben wir: - Namen: Ada lovelace - Profession (Berufsbezeichnung): Sie war Mathematikerin **Dates** Wir haben einen weiteren Dataframe mit dem Namen "dates" in welchem wir nur Info zu 8 der Wissenschaftlerinnen haben. Wir hätten zwar die zwei fehlenden nachschlagen können, aber in diesem Beispiel soll es darum gehen zu zeigen wie die Funktionen sich bei nicht vollständigen Daten verhalten. Wir sehen zwei NAs. Dies heisst nicht dass wir das Todesjahr nicht wissen, sondern dass diese Wissenschaftlerinenn noch leben. **Works** Einen dritten Dataframe in welchem wir sehen wofür die Wissenschaftlerinnen bekannt waren. Zum Beispiel for Ada Lovelace wir sehen den ersten Computer algorhyhtmus. ] --- ## Gewünschter Output ``` # A tibble: 10 × 5 name profession birth_year death_year known_for <chr> <chr> <dbl> <dbl> <chr> 1 Ada Lovelace Mathematic… NA NA first co… 2 Marie Curie Physicist … NA NA theory o… 3 Janaki Ammal Botanist 1897 1984 hybrid s… 4 Chien-Shiung Wu Physicist 1912 1997 confim a… 5 Katherine Johnson Mathematic… 1918 2020 calculat… 6 Rosalind Franklin Chemist 1920 1958 <NA> 7 Vera Rubin Astronomer 1928 2016 existenc… 8 Gladys West Mathematic… 1930 NA mathemat… 9 Flossie Wong-Staal Virologist… 1947 NA first sc… 10 Jennifer Doudna Biochemist 1964 NA one of t… ``` ??? Hier sehen wir unseren gewünschten Output. Das Ziel nachdem die drei Dataframes zusammengefügt wurden: - name und profession aus dem ersten Dataframe - name, birth_year und death_year aus dem zweiten Dataframe - name und known_for aus dem dritten Dataframe --- ## Inputs als Erinnerung .pull-left[ ```r names(professions) ``` ``` [1] "name" "profession" ``` ```r names(dates) ``` ``` [1] "name" "birth_year" "death_year" ``` ```r names(works) ``` ``` [1] "name" "known_for" ``` ] .pull-right[ ```r nrow(professions) ``` ``` [1] 10 ``` ```r nrow(dates) ``` ``` [1] 8 ``` ```r nrow(works) ``` ``` [1] 9 ``` ] ??? - Name ist hier sozusagen der Schlüssel - Professions hat die komplette Info während bei den anderen etwas fehlt --- class: middle, inverse # .large[Dataframes zusammenfügen] --- ## Dataframes zusammenfügen ```r abcd_join(x, y) ``` - `left_join()`: alle Reihen aus x - `right_join()`: alle Reihen aus y - `full_join()`: alle Reihen aus x und y - ... --- ## Beispiel Für die nächsten Folien .pull-left[ ``` # A tibble: 3 × 2 id var_x <dbl> <chr> 1 1 x1 2 2 x2 3 3 x3 ``` ] .pull-right[ ``` # A tibble: 3 × 2 id var_y <dbl> <chr> 1 1 y1 2 2 y2 3 4 y4 ``` ] --- ## `left_join()` .pull-left[ <img src="img/left-join.gif" width="80%" style="background-color: #FDF6E3" style="display: block; margin: auto;" /> ] .pull-right[ ```r left_join(tib_x, tib_y) ``` ``` # A tibble: 3 × 3 id var_x var_y <dbl> <chr> <chr> 1 1 x1 y1 2 2 x2 y2 3 3 x3 <NA> ``` ] --- ## `left_join()` ```r professions %>% * left_join(dates) ``` ``` # A tibble: 10 × 4 name profession birth_year death_year <chr> <chr> <dbl> <dbl> 1 Ada Lovelace Mathematician NA NA 2 Marie Curie Physicist and Chemist NA NA 3 Janaki Ammal Botanist 1897 1984 4 Chien-Shiung Wu Physicist 1912 1997 5 Katherine Johnson Mathematician 1918 2020 6 Rosalind Franklin Chemist 1920 1958 7 Vera Rubin Astronomer 1928 2016 8 Gladys West Mathematician 1930 NA 9 Flossie Wong-Staal Virologist and Molec… 1947 NA 10 Jennifer Doudna Biochemist 1964 NA ``` --- ## `right_join()` .pull-left[ <img src="img/right-join.gif" width="80%" style="background-color: #FDF6E3" style="display: block; margin: auto;" /> ] .pull-right[ ```r right_join(tib_x, tib_y) ``` ``` # A tibble: 3 × 3 id var_x var_y <dbl> <chr> <chr> 1 1 x1 y1 2 2 x2 y2 3 4 <NA> y4 ``` ] --- ## `right_join()` ```r professions %>% * right_join(dates) ``` ``` # A tibble: 8 × 4 name profession birth_year death_year <chr> <chr> <dbl> <dbl> 1 Janaki Ammal Botanist 1897 1984 2 Chien-Shiung Wu Physicist 1912 1997 3 Katherine Johnson Mathematician 1918 2020 4 Rosalind Franklin Chemist 1920 1958 5 Vera Rubin Astronomer 1928 2016 6 Gladys West Mathematician 1930 NA 7 Flossie Wong-Staal Virologist and Molecu… 1947 NA 8 Jennifer Doudna Biochemist 1964 NA ``` --- ## `full_join()` .pull-left[ <img src="img/full-join.gif" width="80%" style="background-color: #FDF6E3" style="display: block; margin: auto;" /> ] .pull-right[ ```r full_join(tib_x, tib_y) ``` ``` # A tibble: 4 × 3 id var_x var_y <dbl> <chr> <chr> 1 1 x1 y1 2 2 x2 y2 3 3 x3 <NA> 4 4 <NA> y4 ``` ] --- ## `full_join()` ```r dates %>% * full_join(works) ``` ``` # A tibble: 10 × 4 name birth_year death_year known_for <chr> <dbl> <dbl> <chr> 1 Janaki Ammal 1897 1984 hybrid species, biod… 2 Chien-Shiung Wu 1912 1997 confim and refine th… 3 Katherine Johnson 1918 2020 calculations of orbi… 4 Rosalind Franklin 1920 1958 <NA> 5 Vera Rubin 1928 2016 existence of dark ma… 6 Gladys West 1930 NA mathematical modelin… 7 Flossie Wong-Staal 1947 NA first scientist to c… 8 Jennifer Doudna 1964 NA one of the primary d… 9 Ada Lovelace NA NA first computer algor… 10 Marie Curie NA NA theory of radioactiv… ``` ??? --- ## Alles in einer Code Sequenz ```r professions %>% left_join(dates) %>% left_join(works) ``` ``` # A tibble: 10 × 5 name profession birth_year death_year known_for <chr> <chr> <dbl> <dbl> <chr> 1 Ada Lovelace Mathematic… NA NA first co… 2 Marie Curie Physicist … NA NA theory o… 3 Janaki Ammal Botanist 1897 1984 hybrid s… 4 Chien-Shiung Wu Physicist 1912 1997 confim a… 5 Katherine Johnson Mathematic… 1918 2020 calculat… 6 Rosalind Franklin Chemist 1920 1958 <NA> 7 Vera Rubin Astronomer 1928 2016 existenc… 8 Gladys West Mathematic… 1930 NA mathemat… 9 Flossie Wong-Staal Virologist… 1947 NA first sc… 10 Jennifer Doudna Biochemist 1964 NA one of t… ``` --- ## Fehlende Daten ergänzen ```r professions %>% left_join(dates) %>% mutate(birth_year = case_when( name == "Ada Lovelace" ~ 1815, # looked up dates on Wikipedia name == "Marie Curie" ~ 1867, TRUE ~ birth_year )) ``` ``` # A tibble: 10 × 4 name profession birth_year death_year <chr> <chr> <dbl> <dbl> 1 Ada Lovelace Mathematician 1815 NA 2 Marie Curie Physicist and Chemist 1867 NA 3 Janaki Ammal Botanist 1897 1984 4 Chien-Shiung Wu Physicist 1912 1997 5 Katherine Johnson Mathematician 1918 2020 6 Rosalind Franklin Chemist 1920 1958 7 Vera Rubin Astronomer 1928 2016 # ℹ 3 more rows ``` --- .note[ # Praktikum 10 - Daten zusammenfügen ## 2er Teams 1. **GitHub**: Öffne die GitHub Organisation für den Kurs: https://github.com/rstatszh-k007 2. **GitHub**: Nutze die Suche um das Praktikum 10 (prak-10) mit deinem Benutzernamen zu finden 3. **GitHub**: Klicke auf den grünen Button (Code) und kopiere die URL in die Zwischenablage 3. **Posit Cloud**: Öffne deinen Arbeitsbereich für den Kurs in der Posit Cloud 4. **Posit Cloud / Projects**: Klicke auf "New Project from GitHub Repository" 5. **RStudio IDE**: Finde den Datei Manager und den Git Reiter 6. **Zoom Chat**: Schreibt wenn ihr soweit seid ] --- ## Inputs - Drei Dataframes .panelset[ .panel[.panel-name[einkaeufe] ``` # A tibble: 9 × 4 kunden_id produkt_name einkauf einheit <chr> <chr> <dbl> <chr> 1 k1 Chips 2 anzahl 2 k1 Milch 3 anzahl 3 k1 Avocado 1 anzahl 4 k2 Pfirsich 2.5 kg 5 k2 Birne 0.5 kg 6 k2 Apfel 2 kg 7 k2 Tomate 1.5 kg 8 k2 Pfirsich 1 kg 9 k2 Milch 4 anzahl ``` ] .panel[.panel-name[preise] ``` # A tibble: 10 × 2 produkt_name preis <chr> <dbl> 1 Toilettenpapier 14.3 2 Chips 3.8 3 Blaubeeren 7.8 4 Milch 2.2 5 Avocado 3.2 6 Banane 1.9 7 Birne 2.6 8 Apfel 4.1 9 Tomate 2.7 10 Pfirsich 6.5 ``` ] .panel[.panel-name[kundenprofile] ``` # A tibble: 5 × 10 kunden_id email phone vorname nachname wohnort kanton plz <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> 1 k1 edwin.du… 075 … Edwin Dumont Domles… Zug 8099 2 k2 leonora.… 076 … Leonora Garcia Hornus… Glarus 6894 3 k3 lydia.bl… 079 … Lydia Blancha… Albula… Zug 5790 4 k4 maeva.mo… 076 … Maeva Moreau Lostal… Zürich 8113 5 k5 frank.le… 077 … Frank Legrand Stein … Bern 4282 # ℹ 2 more variables: geburtstag <date>, alter <dbl> ``` ] ] --- ## Gewünschter Output
vorname
nachname
summe
email
Edwin
Dumont
9.2
edwin.dumont@example.com
Leonora
Garcia
24.6
leonora.garcia@example.com
--- ## Schritt 1 - Daten zusammenfügen ```r einkaeufe_preise <- einkaeufe %>% left_join(preise) einkaeufe_preise ``` ``` # A tibble: 9 × 5 kunden_id produkt_name einkauf einheit preis <chr> <chr> <dbl> <chr> <dbl> 1 k1 Chips 2 anzahl 3.8 2 k1 Milch 3 anzahl 2.2 3 k1 Avocado 1 anzahl 3.2 4 k2 Pfirsich 2.5 kg 6.5 5 k2 Birne 0.5 kg 2.6 6 k2 Apfel 2 kg 4.1 7 k2 Tomate 1.5 kg 2.7 8 k2 Pfirsich 1 kg 6.5 9 k2 Milch 4 anzahl 2.2 ``` --- ## Schritt 2 - Neue Variable erstellen ```r einkaeufe_kosten <- einkaeufe_preise %>% mutate(kosten = einkauf * preis) einkaeufe_kosten ``` ``` # A tibble: 9 × 6 kunden_id produkt_name einkauf einheit preis kosten <chr> <chr> <dbl> <chr> <dbl> <dbl> 1 k1 Chips 2 anzahl 3.8 7.6 2 k1 Milch 3 anzahl 2.2 6.6 3 k1 Avocado 1 anzahl 3.2 3.2 4 k2 Pfirsich 2.5 kg 6.5 16.2 5 k2 Birne 0.5 kg 2.6 1.3 6 k2 Apfel 2 kg 4.1 8.2 7 k2 Tomate 1.5 kg 2.7 4.05 8 k2 Pfirsich 1 kg 6.5 6.5 9 k2 Milch 4 anzahl 2.2 8.8 ``` --- ## Schritt 3 - Daten zusammefassen ```r einkaeufe_kosten_sum <- einkaeufe_kosten %>% group_by(kunden_id) %>% summarise( summe = sum(kosten) ) einkaeufe_kosten_sum ``` ``` # A tibble: 2 × 2 kunden_id summe <chr> <dbl> 1 k1 9.2 2 k2 24.6 ``` --- ## Schritt 4 - Daten zusammenfügen + eingrenzen ```r kunden_tab <- einkaeufe_kosten_sum %>% left_join(kundenprofile) %>% select(ends_with("name"), summe, email) kunden_tab ``` ``` # A tibble: 2 × 4 vorname nachname summe email <chr> <chr> <dbl> <chr> 1 Edwin Dumont 9.2 edwin.dumont@example.com 2 Leonora Garcia 24.6 leonora.garcia@example.com ``` --- ## Schritt 5 - Daten als Tabelle darstellen ```r kunden_tab %>% gt() ```
vorname
nachname
summe
email
Edwin
Dumont
9.2
edwin.dumont@example.com
Leonora
Garcia
24.6
leonora.garcia@example.com
--- ## Als eine Code Sequenz ```r einkaeufe %>% left_join(preise) %>% mutate(kosten = einkauf * preis) %>% group_by(kunden_id) %>% summarise( summe = sum(kosten) ) %>% left_join(kundenprofile) %>% select(ends_with("name"), summe, email) %>% gt() ```
vorname
nachname
summe
email
Edwin
Dumont
17.4
edwin.dumont@example.com
Leonora
Garcia
45.1
leonora.garcia@example.com
--- class: middle, inverse # .large[Funktionen] --- class: middle, inverse # .large[Funktionen - Bonusmaterial] --- .note[ # Praktikum 11 - Funktionen ## Live Coding 1. **GitHub**: Öffne die GitHub Organisation für den Kurs: https://github.com/rstatszh-k007 2. **GitHub**: Nutze die Suche um das Praktikum 11 (prak-11) mit deinem Benutzernamen zu finden 3. **GitHub**: Klicke auf den grünen Button (Code) und kopiere die URL in die Zwischenablage 3. **Posit Cloud**: Öffne deinen Arbeitsbereich für den Kurs in der Posit Cloud 4. **Posit Cloud / Projects**: Klicke auf "New Project from GitHub Repository" 5. **RStudio IDE**: Finde den Datei Manager und den Git Reiter 6. **Zoom Chat**: Schreibt wenn ihr soweit seid ] --- class: middle, inverse # .large[The End] --- class: middle, inverse # .large[The End - Noch nicht ganz] --- # Was habt ihr gelernt? - Anwendung von Tidyverse Packages zum - Importieren, - Aufräumen (Tidying), - Transformieren, - Visualisieren, und - Kommunizieren von Daten. - Kollaboration und Versionsverwaltung mit Git/GitHub - Datenprojekte reproduzierbar publizieren mit GitHub - Das Konzept von Tidy Data --- class: middle, inverse # .large[Wie geht's weiter?] --- # Raus aus der RStudio Cloud 1. Installationen: https://github.com/rstatsZH/kochbuch/tree/main/01-Installation 2. Einmalig: Tidyverse Packages installieren 3. Danach: Tidyverse Packages laden 4. Packages ausserhalb des Tidyverse installieren und laden (e.g. `janitor`) ```r # Einmalig in Konsole ausführen install.packages("tidyverse") # In jedem Skript library(tidyverse) ``` --- class: middle # Weiterführende Ressourcen - Üben + Vertiefen https://rstatszh.github.io/website/posts/2021-04-30-woche07/ --- # Projektarbeit - Unterstützung bis Anfang Mai 2023 **Hausaufgabe 6** 1. GitHub Repository erstellen und RStudio Projekt aufgleisen (Hausaufgabe 6) 2. Daten für das Projekt identifizieren **Wie es weiter geht: Bericht mit R Markdown schreiben** 1. Daten importieren 2. Daten (visuell) erkunden 3. Daten ggf. transformieren und dann erneut (visuell) erkunden 4. Fragen an den Datensatz formulieren 5. Versuchen zu Antworten zu kommen und dokumentieren 6. Immer wieder, git add, commit, push --- class: middle, inverse # .big[Reflexion] --- # Reflexion ## 5 min Nachdenken + Notizen .question[ 1. Was sind die drei nützlichsten Dinge die du gelernt hast? 2. Welches Thema war besonders schwer zu folgen? 3. Was hat dir gefehlt? ] -- <img src="img/kommentar.png" width="100%" style="display: block; margin: auto;" /> --- class: middle, inverse # .big[Feedback] --- class: left background-image: url(img/tor.jpg) background-position: right background-size: contain # Ziele erreicht? Bitte ausfüllen: [https://forms.gle/fEmF9899WEnCETdL8](https://forms.gle/fEmF9899WEnCETdL8) .pull-left[ .footnote[Photo by: [Virgil Cayasa](https://unsplash.com/@virgilcayasa)] ] --- # Wie es für mich weiter geht 1. **Beratung:** Projektbezogener Support, Code Review, Coaching 2. **rstatsZH Kursleitung:** Info über den Kurs verbreiten 3. **Kurse zu vertiefenden Themen:** Entwicklung von 4-Stunden Workshops Contact: [Lars@Lse.de](mailto:lars@lse.de) --- # 🌻 Danke Für die Aufmerksamkeit! Für die R packages [{xaringan}](https://github.com/yihui/xaringan) und [{xaringanthemer}](https://github.com/gadenbuie/xaringanthemer) mit welchen die Folien geschrieben wurden. Eine PDF Version der Folien kann hier heruntergeladen werden: https://github.com/rstatsZH/website/raw/master/slides/e1_d07-data-join/e1_d07-data-join.pdf
Für [Data Science in a Box](https://datasciencebox.org/) und [Remaster the Tidyverse](https://github.com/rstudio-education/remaster-the-tidyverse), von welchen ich Materialien für diesen Kurs nutze und welche genau wie diese Folien mit [Creative Commons Attribution Share Alike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/) lizensiert sind.