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 ## Vektoren / Daten Importieren / Daten Aufräumen .bottom[
Lars Schöbitz
2023-10-12
] --- # Rückblick - Woche 5 - Git / GitHub - push / pull - Funktion zum Umgang mit einem Datum - `lubridate::as_date()` - Visualisierungen - Verbundene Streudiagramm - `geom_point()` + `geom_path()` --- class: middle, inverse # Hausaufgabe 5 - Rückblick --- # Ziele für diese Woche Am Ende dieser Woche könnt ihr: - Daten aus verschiedenen Formaten in R importieren - Erkennen wann es notwendig ist Datumswerte aus Rohdaten in R selbst zu codieren - Daten aus einem weiten Format in ein langes Format bringen - Erkennen ob Daten als Tidy data klassifiert werden können --- .note[ # Demonstration 2 - Vektoren 1. Schaut mir beim Programmieren zu 2. Macht euch Notizen und stellt Fragen **Das Skript mit den Lösungen bekommt ihr im Anschluss** ] --- class: middle, inverse # .big[Daten importieren] --- class: middle # Rechteckige Daten .pull-left[ <img src="img/readr.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right[ <img src="img/readxl.png" width="80%" style="display: block; margin: auto;" /> ] --- .pull-left[ ## readr - `read_csv()` - Dateien mit Kommatrennung der Spalten - `read_csv2()` - Dateien mit Semicolon getrennten Spalten - `read_tsv()` - Dateien mit Tab getrennten Spalten - `read_delim()` - Dateien mit selbst definierter Trennung ] -- .pull-right[ ## readxl - `read_excel()` - read xls or xlsx files ] --- ## Daten lesen ```r treibhaus <- read_csv("data/ugz_treibhausgasbilanz.csv") treibhaus ``` ``` # A tibble: 27 × 9 Jahr Strom Kerosin Diesel Benzin Holz_UW_BG_SK Fernwaerme <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1990 0.324 0.638 0.418 1.09 0.021 0.228 2 1991 0.292 0.614 0.415 1.08 0.02 0.227 3 1992 0.263 0.637 0.418 1.08 0.02 0.229 4 1993 0.243 0.651 0.419 1.09 0.02 0.232 5 1994 0.229 0.661 0.416 1.10 0.02 0.234 6 1995 0.242 0.689 0.415 1.10 0.02 0.237 # ℹ 21 more rows # ℹ 2 more variables: Erdgas <dbl>, Heizoel_EL <dbl> ``` --- # Daten schreiben ## Eine Datei schreiben ```r *fussball_weltmeister <- tibble( jahr = as.integer(c(2018, 2014, 2010, 2006, 2019, 2015, 2011, 2007)), weltmeisterschaft = c(rep("Männer", 4), rep("Frauen", 4)), titeltraeger = c("Frankreich", "Deutschland", "Spanien", "Italien", "USA", "USA", "Japan", "Deutschland")) *write_csv(x = fussball_weltmeister, file = "data/fussball_weltmeister.csv") ``` --- ## Die Datei wieder einleisen ```r read_csv("data/fussball_weltmeister.csv") ``` ``` # A tibble: 8 × 3 jahr weltmeisterschaft titeltraeger <dbl> <chr> <chr> 1 2018 Männer Frankreich 2 2014 Männer Deutschland 3 2010 Männer Spanien 4 2006 Männer Italien 5 2019 Frauen USA 6 2015 Frauen USA # ℹ 2 more rows ``` --- class: middle, inverse # .large[Variablen Namen] --- # Variablen Namen .pull-left[ ```r schlechte_namen <- read_csv("data/bsp_namen.csv") names(schlechte_namen) ``` ``` [1] "Nachname Frau" "Nachname Mann" ``` In R sind Leerzeichen in Variablen nicht erlaubt ```r schlechte_namen %>% filter(Nachname Frau == "Meier") ``` ``` Error: <text>:2:20: unexpected symbol 1: schlechte_namen %>% 2: filter(Nachname Frau ^ ``` ] -- .pull-right[ Möglich mit Backticks, aber mühsam ```r schlechte_namen %>% filter(`Nachname Frau` == "Meier") ``` ``` # A tibble: 1 × 2 `Nachname Frau` `Nachname Mann` <chr> <chr> 1 Meier Müller ``` ] --- # Möglichkeit 1 - Variablen namen in readr Funktion definieren ```r read_csv("data/bsp_namen.csv", col_names = c("nachname_frau", "nachname_mann"), skip = 1) ``` ``` # A tibble: 3 × 2 nachname_frau nachname_mann <chr> <chr> 1 Müller Meier 2 Meier Müller 3 Schmid Schmid ``` --- # Möglichkeit 2 - Variablen namen mit janitor Package bereinigen - Namen werden standardmässig im sogenannten snake_case formatiert ```r library(janitor) namen <- read_csv("data/bsp_namen.csv") namen %>% clean_names() ``` ``` # A tibble: 3 × 2 nachname_frau nachname_mann <chr> <chr> 1 Müller Meier 2 Meier Müller 3 Schmid Schmid ``` --- class: middle, inverse # .large[Variable Typen] --- Welcher Variablen Typ ist die Spalte `id`? .pull-left[ .note[ 1. character 2. double 3. integer 4. logical ] ] .pull-right[ <img src="img/df-na.png" width="80%" style="display: block; margin: auto;" /> ] --- ```r read_csv("data/data-na.csv") ``` ``` # A tibble: 10 × 4 id name alter bewertung <chr> <chr> <chr> <chr> 1 1 Not applicable 46 trifft nicht zu 2 2 Ellen 14 trifft zu 3 <NA> Tilde zwanzig trifft eher zu 4 4 Lorraine 39 teils-teils 5 5 Juan 91 trifft eher nicht zu 6 6 Anush 63 trifft eher nicht zu 7 . Sandile 9999 trifft zu 8 8 Martha 38 trifft zu 9 9 Mason 43 teils-teils 10 10 Ege 36 teils-teils ``` --- # NAs beim einlesen definieren ```r read_csv("data/data-na.csv", na = c("NA", ".", "9999", "Not applicable")) ``` .pull-left[ <img src="img/df-na.png" width="70%" style="display: block; margin: auto;" /> ] .pull-right[ ``` # A tibble: 10 × 4 id name alter bewertung <dbl> <chr> <chr> <chr> 1 1 <NA> 46 trifft nicht zu 2 2 Ellen 14 trifft zu 3 NA Tilde zwanzig trifft eher zu 4 4 Lorraine 39 teils-teils 5 5 Juan 91 trifft eher nicht zu 6 6 Anush 63 trifft eher nicht zu 7 NA Sandile <NA> trifft zu 8 8 Martha 38 trifft zu 9 9 Mason 43 teils-teils 10 10 Ege 36 teils-teils ``` ] --- Welcher Variablen Typ ist die Spalte `alter`? .pull-left[ .note[ 1. character 2. double 3. integer 4. logical ] ] .pull-right[ <img src="img/df-na.png" width="100%" style="display: block; margin: auto;" /> ] --- ```r dat <- read_csv("data/data-na.csv", na = c("NA", ".", "9999", "Not applicable")) dat ``` ``` # A tibble: 10 × 4 id name alter bewertung <dbl> <chr> <chr> <chr> 1 1 <NA> 46 trifft nicht zu 2 2 Ellen 14 trifft zu 3 NA Tilde zwanzig trifft eher zu 4 4 Lorraine 39 teils-teils 5 5 Juan 91 trifft eher nicht zu 6 6 Anush 63 trifft eher nicht zu 7 NA Sandile <NA> trifft zu 8 8 Martha 38 trifft zu 9 9 Mason 43 teils-teils 10 10 Ege 36 teils-teils ``` --- # Variable `alter` umwandeln - numerisch ```r dat <- read_csv("data/data-na.csv", na = c("NA", ".", "9999", "Not applicable")) ``` -- ```r dat <- dat %>% mutate(alter = case_when( alter == "zwanzig" ~ "20", # Wenn "alter" gleich zwanzig dann "20" TRUE ~ alter)) %>% # Sonst "alter" mutate(alter = as.numeric(alter)) # Unwandlung in den Typ numerisch ``` -- ``` # A tibble: 10 × 4 id name alter bewertung <dbl> <chr> <dbl> <chr> 1 1 <NA> 46 trifft nicht zu 2 2 Ellen 14 trifft zu 3 NA Tilde 20 trifft eher zu 4 4 Lorraine 39 teils-teils 5 5 Juan 91 trifft eher nicht zu # ℹ 5 more rows ``` --- # Variable `bewertung` - Häufgkeitstabelle .pull-left[ ```r dat %>% count(bewertung) ``` ``` # A tibble: 5 × 2 bewertung n <chr> <int> 1 teils-teils 3 2 trifft eher nicht zu 2 3 trifft eher zu 1 4 trifft nicht zu 1 5 trifft zu 3 ``` ] .pull-right[ <img src="img/df-fct.png" width="100%" style="display: block; margin: auto;" /> ] --- # Variable `bewertung` - Visualisierung ```r ggplot(dat, aes(x = bewertung)) + geom_bar() + coord_flip() ``` <img src="e1_d06-data-import-tidy_files/figure-html/unnamed-chunk-29-1.png" width="80%" style="display: block; margin: auto;" /> --- # Variable `bewertung` umwandeln - faktor ```r vek_bewertung_lvl <- c("trifft nicht zu", "trifft eher nicht zu", "teils-teils", "trifft eher zu", "trifft zu") dat <- dat %>% mutate(bewertung = fct_relevel(bewertung, vek_bewertung_lvl)) ``` --- # Variable `bewertung` - Häufgkeitstabelle ```r dat %>% count(bewertung) ``` ``` # A tibble: 5 × 2 bewertung n <fct> <int> 1 trifft nicht zu 1 2 trifft eher nicht zu 2 3 teils-teils 3 4 trifft eher zu 1 5 trifft zu 3 ``` --- # Variable `bewertung` - Visualisierung ```r ggplot(dat, aes(x = bewertung)) + geom_bar() + coord_flip() ``` <img src="e1_d06-data-import-tidy_files/figure-html/unnamed-chunk-32-1.png" width="80%" style="display: block; margin: auto;" /> --- # Als eine Code Sequenz ```r vek_bewertung_lvl <- c("trifft nicht zu", "trifft eher nicht zu", "teils-teils", "trifft eher zu", "trifft zu") dat_clean <- read_csv("data/data-na.csv", na = c("NA", ".", "9999", "Not applicable")) %>% mutate(alter = case_when( alter == "zwanzig" ~ "20", # Wenn "alter" gleich zwanzig dann "20" TRUE ~ alter)) %>% # Sonst "alter" mutate(alter = as.numeric(alter)) %>% # Unwandlung in den Typ numerisch mutate(bewertung = fct_relevel(bewertung, # Umwandlung in den Typ faktor vek_bewertung_lvl)) # Mit definierten Levels ``` --- # Daten schreiben und wieder lesen .question[ Was ist denn nun wieder mit der Variable `bewertung` passiert? ] ```r write_csv(dat_clean, file = "data/data-bewertung-clean.csv") dat_clean_csv <- read_csv(file = "data/data-bewertung-clean.csv") dat_clean_csv ``` ``` # A tibble: 10 × 4 id name alter bewertung <dbl> <chr> <dbl> <chr> 1 1 <NA> 46 trifft nicht zu 2 2 Ellen 14 trifft zu 3 NA Tilde 20 trifft eher zu 4 4 Lorraine 39 teils-teils 5 5 Juan 91 trifft eher nicht zu 6 6 Anush 63 trifft eher nicht zu # ℹ 4 more rows ``` --- # Funktionen: `read_rds()` und `write_rds()` - Zwischenergebnisse als CSV zu speichern ist unzuerverlässig, wenn bestimmte Variablen Typen beibehalten werden sollen - `read_csv()` kann nicht wissen welche Level eine Faktor Variable hat - Eine gute Alternative sind RDS-Dateien, ein R-internes Dateiformat ```r write_rds(dat_clean, file = "data/data-bewertung-clean.rds") dat_clean_rds <- read_rds(file = "data/data-bewertung-clean.rds") dat_clean_rds ``` ``` # A tibble: 10 × 4 id name alter bewertung <dbl> <chr> <dbl> <fct> 1 1 <NA> 46 trifft nicht zu 2 2 Ellen 14 trifft zu 3 NA Tilde 20 trifft eher zu 4 4 Lorraine 39 teils-teils 5 5 Juan 91 trifft eher nicht zu 6 6 Anush 63 trifft eher nicht zu # ℹ 4 more rows ``` --- class: left background-image: url(img/coffee-break.jpg) background-position: right background-size: contain # Pause
−
+
10
:
00
.footnote[Photo by: [Blake Wisz](https://unsplash.com/@blakewisz)] --- .note[ # Praktikum 9 - Daten importieren - Treibhausgasbilanz ## 2er Teams - Übung 1 1. **GitHub**: Öffne die GitHub Organisation für den Kurs: https://github.com/rstatszh-k007 2. **GitHub**: Nutze die Suche um das Praktikum 09 (prak-09) 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: inverse, middle # .large[Tidy data] --- # Tidy data Eigenschaften von Tidy data: - Eigenschaft 1: Jede Spalte ist eine Variable - Eigenschaft 2: Jede Reihe ist eine Beobachtung - Eigenschaft 3: Jede Zelle enthält eine Messung --- # Penguins .question[ Erfüllen die Daten die Eingeschaften für Tidy data? ] <table class="table" style="font-size: 20px; 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: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> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 38.9 </td> <td style="text-align:right;"> 17.8 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3625 </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.2 </td> <td style="text-align:right;"> 19.6 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 4675 </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;"> 34.1 </td> <td style="text-align:right;"> 18.1 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3475 </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;"> 42.0 </td> <td style="text-align:right;"> 20.2 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 4250 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2007 </td> </tr> </tbody> </table> --- background-image: url("img/untidy-data/untidy-data.001.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Ständige Wohnbevölkerung nach Altersklasse und Altersmasszahlen nach Kanton, Provisorische Jahresergebnisse, 2020]( https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.16404478.html)] ] --- background-image: url("img/untidy-data/untidy-data.002.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Ständige Wohnbevölkerung nach Altersklasse und Altersmasszahlen nach Kanton, Provisorische Jahresergebnisse, 2020]( https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.16404478.html)] ] --- background-image: url("img/untidy-data/untidy-data.003.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Ständige Wohnbevölkerung nach Altersklasse und Altersmasszahlen nach Kanton, Provisorische Jahresergebnisse, 2020]( https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.16404478.html)] ] --- background-image: url("img/untidy-data/untidy-data.004.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Kosten des Gesundheitswesens nach Leistungen]( https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.14840808.html)] ] --- background-image: url("img/untidy-data/untidy-data.005.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Kosten des Gesundheitswesens nach Leistungen]( https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.14840808.html)] ] --- background-image: url("img/untidy-data/untidy-data.006.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Kosten des Gesundheitswesens nach Leistungen]() https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.14840808.html)] ] --- background-image: url("img/untidy-data/untidy-data.007.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Klimadaten: Eistage, Frosttage, Sommertage, Hitzetage, Tropennächte und Niederschlagstage](https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.15964164.html)] ] --- background-image: url("img/untidy-data/untidy-data.008.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Klimadaten: Eistage, Frosttage, Sommertage, Hitzetage, Tropennächte und Niederschlagstage](https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.15964164.html)] ] --- background-image: url("img/untidy-data/untidy-data.009.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Klimadaten: Eistage, Frosttage, Sommertage, Hitzetage, Tropennächte und Niederschlagstage](https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.15964164.html)] ] --- background-image: url("img/untidy-data/untidy-data.010.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Klimadaten: Eistage, Frosttage, Sommertage, Hitzetage, Tropennächte und Niederschlagstage](https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.15964164.html)] ] --- background-image: url("img/untidy-data/untidy-data.011.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Klimadaten: Eistage, Frosttage, Sommertage, Hitzetage, Tropennächte und Niederschlagstage](https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.15964164.html)] ] --- background-image: url("img/untidy-data/untidy-data.012.png") background-size: contain .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] .footnote[ .small[Quelle: [Bundesamt für Statistik - Klimadaten: Eistage, Frosttage, Sommertage, Hitzetage, Tropennächte und Niederschlagstage](https://www.bfs.admin.ch/bfs/de/home/statistiken/kataloge-datenbanken/tabellen.assetdetail.15964164.html)] ] ??? - 6 Tabellen in 6 Tabs -> Eine Variable (typ_tag) - In Zeile 1 steckt eine Variable (Name: typ_tag) - In Zeile 4 steckt eine Definition für die Variable: typ_tag - In Zeile 4 stecke eine Definition für einen Mittelwert auf Zeile 8 - Links lässt sich erkennen, dass Zeile "versteckt" sind? Doch nicht. Zeilen klein gemacht, aber leer. - Zeile 6 enthält eine Variable für den Ort der Messstation. - Zeile 7 enthält eine Variable für dier Höhe der Messstation - Spalte A, ab Zeile 11 enthält das Jahr der Messungen - Spalten B bis N enthalten die Messungen nach Messstationen - Einige Zeilen sind blau markiert, aber es scheint nur eine Lesehilfe zu sein - Metadaten und Bemerkungen sind in den Zeilen 75 bis 81 abgelegt --- # Relevanter Unterschied - Ziel der Daten Publikation .pull-left[ **Daten in Tabellen darstellen** - Layout - Gut leserlich - Kompakt - Erkenntnis bringend - Metadaten ] .pull-right[ **Daten für weitere Nutzung bereitstellen** - Layout (Tidy data) - Eigenschaft 1: Jede Spalte ist eine Variable - Eigenschaft 2: Jede Reihe ist eine Beobachtung - Eigenschaft 3: Jede Zelle enthält eine Messung - Keine Metadaten - Keine Farben, Formatierungen, etc. - Folgt Standards (Datum: ISO 8601) - etc. ] --- .note[ # Praktikum 9 - Data tidying - Treibhausgasbilanz ## 2er Teams - Übung 2 + 3 - Öffnet nochmals das Praktikum 9 ] --- class: middle, inverse # .large[Data tidying] --- # Treibhausgasemissionen .question[ Welche Eigenschaften von Tidy data sind hier nicht erfüllt? ] <table class="table" style="font-size: 24px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> Jahr </th> <th style="text-align:right;"> Strom </th> <th style="text-align:right;"> Kerosin </th> <th style="text-align:right;"> Diesel </th> <th style="text-align:right;"> Benzin </th> <th style="text-align:right;"> Holz_UW_BG_SK </th> <th style="text-align:right;"> Fernwaerme </th> <th style="text-align:right;"> Erdgas </th> <th style="text-align:right;"> Heizoel_EL </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 1990 </td> <td style="text-align:right;"> 0.324 </td> <td style="text-align:right;"> 0.638 </td> <td style="text-align:right;"> 0.418 </td> <td style="text-align:right;"> 1.087 </td> <td style="text-align:right;"> 0.021 </td> <td style="text-align:right;"> 0.228 </td> <td style="text-align:right;"> 1.015 </td> <td style="text-align:right;"> 2.445 </td> </tr> <tr> <td style="text-align:right;"> 1991 </td> <td style="text-align:right;"> 0.292 </td> <td style="text-align:right;"> 0.614 </td> <td style="text-align:right;"> 0.415 </td> <td style="text-align:right;"> 1.081 </td> <td style="text-align:right;"> 0.020 </td> <td style="text-align:right;"> 0.227 </td> <td style="text-align:right;"> 1.037 </td> <td style="text-align:right;"> 2.338 </td> </tr> <tr> <td style="text-align:right;"> 1992 </td> <td style="text-align:right;"> 0.263 </td> <td style="text-align:right;"> 0.637 </td> <td style="text-align:right;"> 0.418 </td> <td style="text-align:right;"> 1.083 </td> <td style="text-align:right;"> 0.020 </td> <td style="text-align:right;"> 0.229 </td> <td style="text-align:right;"> 1.071 </td> <td style="text-align:right;"> 2.258 </td> </tr> <tr> <td style="text-align:right;"> 1993 </td> <td style="text-align:right;"> 0.243 </td> <td style="text-align:right;"> 0.651 </td> <td style="text-align:right;"> 0.419 </td> <td style="text-align:right;"> 1.093 </td> <td style="text-align:right;"> 0.020 </td> <td style="text-align:right;"> 0.232 </td> <td style="text-align:right;"> 1.108 </td> <td style="text-align:right;"> 2.185 </td> </tr> <tr> <td style="text-align:right;"> 1994 </td> <td style="text-align:right;"> 0.229 </td> <td style="text-align:right;"> 0.661 </td> <td style="text-align:right;"> 0.416 </td> <td style="text-align:right;"> 1.099 </td> <td style="text-align:right;"> 0.020 </td> <td style="text-align:right;"> 0.234 </td> <td style="text-align:right;"> 1.143 </td> <td style="text-align:right;"> 2.109 </td> </tr> </tbody> </table> -- - ❌ Eigenschaft 1: Jede Spalte ist eine Variable - ✅ Eigenschaft 2: Jede Reihe ist eine Beobachtung - ✅ Eigenschaft 3: Jede Zelle enthält eine Messung --- # Treibhausgasemissionen .question[ Wie wären alle Eigenschaften erfüllt? ] .pull-left[ **Vorher** ``` # A tibble: 27 × 9 Jahr Strom Kerosin Diesel Benzin Holz_UW_BG_SK Fernwaerme <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1990 0.324 0.638 0.418 1.09 0.021 0.228 2 1991 0.292 0.614 0.415 1.08 0.02 0.227 3 1992 0.263 0.637 0.418 1.08 0.02 0.229 4 1993 0.243 0.651 0.419 1.09 0.02 0.232 5 1994 0.229 0.661 0.416 1.10 0.02 0.234 6 1995 0.242 0.689 0.415 1.10 0.02 0.237 # ℹ 21 more rows # ℹ 2 more variables: Erdgas <dbl>, Heizoel_EL <dbl> ``` ] -- .pull-right[ **Nachher** ``` # A tibble: 216 × 3 Jahr Energietraeger Emissionen <dbl> <chr> <dbl> 1 1990 Strom 0.324 2 1990 Kerosin 0.638 3 1990 Diesel 0.418 4 1990 Benzin 1.09 5 1990 Holz_UW_BG_SK 0.021 6 1990 Fernwaerme 0.228 # ℹ 210 more rows ``` ] --- # R Package `tidyr` - Grammatik zum Daten aufräumen .pull-left[ <img src="img/tidyr-part-of-tidyverse.png" width="50%" style="display: block; margin: auto;" /> ] .pull-right[ Das Ziel des `tidyr` Package ist des Daten aufzuräumen mittels: - drehen (pivoting) von Daten um das Datenformat zwischen lang und weit zu wechseln - teilen und kombinieren von Spalten - klarstellen wit mit `NA`s umgegangen werden soll ] --- # Pivoting - `pivot_longer()` - Daten in ein langes Format bringen - `pivot_wider()` - Daten in ein weites Format bringen .center[ <img src="img/tidyr-longer-wider.gif" width="45%" style="background-color: #FDF6E3" style="display: block; margin: auto;" /> ] - https://tidyr.tidyverse.org/ --- # `pivot_longer()` - **cols**: Spalten die in das lange Format konveriert werden sollen - **names_to**: Name der neuen Spalte in welcher die gedrehten Variablen auftauchen sollen - **values_to**: Name der neuen Spalte in welcher die Werte der gedrehten Variablen auftauchen sollen ```r ghg_tidy <- ghg %>% pivot_longer( cols = Strom:Heizoel_EL, # Variablen von Strom bis Heizoel_EL names_to = "Energietraeger", # Variablen Namen -> Neue Spalte Energietraeger values_to = "Emissionen" # Variablen Werte -> Neue Spalte Emissionen ) %>% mutate(Jahr = as_factor(Jahr)) # Die Variable Jahr als Faktor definiert ``` --- # Warum Tidy data? Warum pivoting? .panelset[ .panel[.panel-name[Code] ```r ggplot(data = ghg_tidy, # Daten im neuen Format mapping = aes(x = Jahr, # Bestehende Variable Jahr y = Emissionen, # Neue Variable Emissionen fill = Energietraeger)) + # Energieträger als Farben geom_col() + # Plot Styling ab hier scale_fill_brewer(type = "qual", palette = 1) + scale_y_continuous(breaks = seq(0, 7, 1), expand = c(0, 0), limits = c(0, 7)) + labs(title = "Treibhausgasbilanz 1990 bis 2016", y = "Treibhausgasemissionen [t CO2eq/Person]", x = NULL, caption = "Daten: https://data.stadt-zuerich.ch/dataset/ugz_treibhausgasbilanz", fill = "Energieträger") + theme_minimal(base_size = 14) + theme(panel.grid.major.x = element_blank(), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 10)) ``` ] .panel[.panel-name[Plot] <img src="e1_d06-data-import-tidy_files/figure-html/unnamed-chunk-44-1.png" width="80%" style="display: block; margin: auto;" /> ] ] --- class: middle, inverse # .big[Hausaufgabe] --- 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)] ] --- # 🌻 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_d06-data-import-tidy/e1_d06-data-import-tidy.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.