adapted from trueloveproperty.co.uk

Überblick

In diesem Practical wirst du das Transformieren, Gruppieren und Analysieren von Daten mit dplyr üben.

Am Ende des Practicals wirst du wissen wie man:

  1. Daten transformiert.
  2. Daten gruppiert und deskriptive Statistiken berechnen kann.

Aufgaben

A - Setup

  1. Öffne dein TheRBootcamp R project. Es sollte bereits die Ordner 1_Data und 2_Code enthalten.

  2. Öffne ein neues R Skript. Schreibe deinen Namen, das Datum und “Wrangling II Practical” als Kommentare an den Anfang des Skripts.

## NAME
## DATUM
## Wrangling II Practical
  1. Speichere das neue Skript unter dem Namen wrangling_II_practical.R im 2_Code Ordner.

  2. Lade das tidyverse.

# Pakete laden
library(tidyverse)     

B - Transformation von Long zu Wide Format

In diesem Abschnitt arbeitest du zunächst mit dem bevoelkerung.csv Datensatz. Er enthält die Einwohnerzahlen verschiedener Schweizer Städte von 1930 bis 2011. Im Datensätze Tab findest du eine Auflistung und eine kurze Beschreibung der im Datensatz enthaltenen Variablen.

  1. Lese den Datensatz mit der read_csv() Funktion in R ein und speichere ihn unter dem Namen bevoelkerung.
bevoelkerung <- read_csv(file = "1_Data/bevoelkerung.csv")
  1. Mache dich mit dem Datensatz vertraut in dem du die ersten paar Zeilen (print()) und die Variablennamen (names()) anschaust.

  2. Im Moment sind die Daten so angeordnet, dass jedes Jahr eine einzelne Spalte hat, d.h. es liegt ein Wide Format vor; wir wollen sie aber im Long format. Verwende pivot_longer() um das Format zu wechseln. Verwende "st_wbev_2011" und "st_wbev_2001" für das cols Argument und "jahr" für das names_to Argument und speichere das Resultat als neues Objekt bevoelkerung_long ab.

# Transofmation vom Wide ins Long Format
bevoelkerung_long <- bevoelkerung %>%
  pivot_longer(cols = c("XX", "XX"), names_to = "XX")
  1. Printe den neu erstellten Datensatz. Alles wie erwartet?

  2. Nun bringe nicht nur die Jahre 2001 und 2011, sondern alle im Datensatz vorhandenen Jahre ins Long-Format. Schaue dir zunächst nochmals die Namen der Spalten mit names() an.

  3. Jede Jahr-Variable hat die gleiche Struktur, nämlich st_wbev_XXX. Das bedeutet, dass du die sehr hilfreiche starts_with() Funktion zur Variablenauswahl verwenden kannst. Benutze pivot_longer() und starts_with() um alle Jahr-Variablen zu transformieren.

# Transofmation vom Wide ins Long Format
bevoelkerung_long <- bevoelkerung %>%
  pivot_longer(cols = starts_with("XX"), names_to = "XX")
  1. Printe nochmals bevoelkerung_long.

  2. Die Einwohnerzahl ist im neuen Datensatz mi dem Standardwert value benannt. Führe nun nochmal die pivot_longer Funktion aus, verwende nun aber auch noch das values_to Argument um die neue Spalte einwohner zu nennen.

# Transofmation vom Wide ins Long Format
bevoelkerung_long <- bevoelkerung %>%
  pivot_longer(cols = starts_with("XX"), names_to = "XX", values_to = "XX")
  1. Schaue dir das Resultat an. Alles in Ordnung?

  2. Verwende nun das names_prefix Argument um die Präfixe der Jahreszahlen ("st_wbev_") automatisch zu entfernen. Der character-String der für names_prefix bereit gestellt wird, wird vom Beginn der Variablennamen entfernt.

C - Transformation von Long zu Wide Format

  1. Nun nimm an, dass du die Daten als bevoelkerung_long im Long Format bekommen hättest und sie ins Wide Format umwandeln müsstest. Verwende die pivot_wider() Funktion und weise den Argumenten names_from und values_from die Spalten jahr und einwohner zu. Speichere das Ergebnis als bevoelkerung_wide ab.
# Transofmation vom Long ins Wide Format
bevoelkerung_wide <- bevoelkerung_long %>%
  pivot_wider(names_from = XX, values_from = XX)
  1. Vergleiche bevoelkerung_wide mit bevoelkerung. War die Rücktransformation erfolgreich? Was fehlt?

  2. Um die zuvor entfernten Präfixe wieder bei den Variablennamen hinzuzufügen, kannst du das names_prefix argument in pivot_wider() verwenden. Benutze names_prefix um "st_wbev_" als Präfix wieder hinzuzufügen.

D - Wiederholung Wrangling I

Im Rest des Practicals arbeitst du mit dem kc_house.csv Datensatz. Er enthält Verkaufspreise von Häusern in King County, Washington. Aufgelistet sind Häuser, welche zwischen Mai 2014 und Mai 2015 verkauft wurden. Nebst den Verkaufspreisen enthält der Datensatz Spezifikationen der Häuser, z.B. die Anzahl Zimmer eines Hauses.

  1. Lese den Datensatz mit der read_csv() Funktion in R ein und speichere ihn unter dem Namen kc_house.
kc_house <- read_csv(file = "1_Data/kc_house.csv")
  1. Printe den Datensatz und verwende summary() und names() um einen Eindruck über dessen Struktur zu erhalten.

  2. Da es sich um einen US Datensatz handelt, sind die Flächenangaben in Quadratfuss angegeben. Wir als “rest of the world” sind es natürlich eher gewohnt in Quadratmeter zu denken. Kreiere dazu drei neue Variablen qm_wohnraum, qm_dachstock und qm_keller, welche die jeweilige Raumgrösse in Quadratmeter angeben. Ein Quadratfuss entspricht 0.093 Quadratmeter.

kc_house <- kc_house %>%
  mutate(XX = XX * 0.093,
         XX = XX * 0.093,
         XX  = XX * 0.093)
  1. Kreiere wiederum mit mutate() eine neue Spalte qm_total, welche die Summe aus qm_wohnraum, qm_dachstock und qm_keller darstellt.

  2. Füge eine neue Variable villa hinzu (mit mutate()), welche den Wert "ja" annimmt, wenn qm_total grösser als 750 ist und “nein”, wenn qm_total kleiner oder gleich 750 ist.

E - summarise

  1. Unter Verwendung der base-R TIBBLE$VARIABLE-Notation, berechne den Mittelwert über alle Hauspreise mit mean().

  2. Berechne wieder den Mittelwert aber verwende diesmal mean() innerhalb der summarise() Funktion. Besteht ein Unterschied in den Resultaten dieser und der vorherigen Aufgabe?

kc_house %>%
  summarise(
    XX = mean(XX)
  )
  1. Wie hoch ist der höchste Verkaufspreis? Verwende die max() Funktion.

  2. Sortiere mittels der arrange() und der desc() Funktion den Datensatz nach preis in absteigender Reihenfolge und printe das Resultat. Richtig sortiert?

  3. Wie gross ist der Anteil an Häuser, welche für mehr als 1 Million USD verkauft wurden?

kc_house %>%
  summarise(million_prozent = mean(XX > XX))
  1. Berechne die mittlere Anzahl Stockwerke (stoecke) und Badezimmer (badezimmer) von Villen (villa). Verwende erst filter() um Villen auszuwählen und danach summarise().

F - group_by und summarise

  1. Verwende group_by(), summarise() und n() um zu berechnen wie viele Villen und wie viele normale Häuser (nicht-Villen) im Datensatz vorhanden sind.
kc_house %>%
  group_by(XX) %>%
  summarise(N = XX)
  1. Ergänze nun einen Eintrag in summarise(), der den mittlere Verkaufspreis von Villen und normalen Häusern (nicht-Villen) berechnet?

  2. Berechne nun auch noch das Minimum (min()) und Maximum (min()).

  3. Haben Häuser, welche später gebaut wurden, eine grössere Wohnfläche? Gruppiere zur Beantwortung dieser Frage die Daten nach baujahr und berechne dann die mittlere Wohnfläche (qm_wohnraum).

G - Mehrere Gruppen

  1. Dein Freund Theodorus interessiert sich für Häuser einer bestimmten Gegend, nämlich mit den Postleitzahlen (postleitzahl) 98001, 98109, 98117 und 98199. Stelle ihm einen neuen Datensatz theodorus zusammen, welcher nur die Häuser dieser Gegend enthält. Tipp: der %in% Operator testet ob Elemente des Vektors auf der rechten Seite im Vektor auf der linken Seite enthalten sind.
theodorus <- kc_house %>%
  filter(XX %in% c(XX, XX, XX, XX))
  1. Berechne für Theodorus den mittleren, den den Minimum-, den Maximumpreis, sowie die Anzahl Häuser pro Gruppe, separat für die Postleitzahlen und ob es eine Villa ist.

X - Challenges

  1. Welche Postleitzahl hat den höchsten Anteil Häuser, welche am Ufer gebaut sind (ufer)? Printe nur diese Zeile des Datensatzes.

  2. Welches Haus hat das schlechteste Preis-Wohnraumgrösse Verhältnis? Printe nur diese Zeile des Datensatzes.

  3. Welche 10 Postleitzahlen haben im Schnitt die höchsten Hauspreise? Printe nur diese 10 Zeilen.

  4. Kreiere den folgenden Datensatz genau wie er unten steht.

baujahr N preis_mean preis_max qm_wohnraum_mean
1990 320 563966 3640900 234
1991 224 630441 5300000 244
1992 198 548169 2480000 223
1993 202 556612 3120000 226
1994 249 486834 2880500 209
1995 169 577771 3200000 224
1996 195 639534 3100000 240
1997 177 606058 3800000 234
1998 239 594159 1960000 241

Beispiele

# Wrangling II mit dplyr and tidyr ---------------------------

library(tidyverse)    # Lade tidyverse für dplyr

# Lese den basel Datensatz ein
basel <- read_csv("1_Data/basel.txt")

# Keine Gruppierungsvariable
bas <- basel %>%
  summarise(
    alter_m = mean(alter, na.rm = TRUE),
    einkommen_median = median(einkommen, na.rm = TRUE),
    N = n()
  )

bas

# Eine Gruppierungsvariable
bas_ges <- basel %>%
  group_by(geschlecht) %>%
  summarise(
    alter_m = mean(alter, na.rm = TRUE),
    einkommen_median = median(einkommen, na.rm = TRUE),
    N = n()
  )

bas_ges

# Zwei Gruppierungsvariablen
bas_ges_bil <- basel %>%
  group_by(geschlecht, bildung) %>%
  summarise(
    alter_m = mean(alter, na.rm = TRUE),
    einkommen_median = median(einkommen, na.rm = TRUE),
    N = n()
  )

bas_ges_bil

# Gruppiere nach Geschlecht und Bildung und berechne den Mittelwert aller 
# Variablen des Typs numeric
basel %>%
  group_by(geschlecht, bildung) %>%
  summarise_if(is.numeric, mean, na.rm = TRUE)

Datensätze

File Zeilen Spalten Beschreibung
kc_house.csv 21613 11 Verkaufspreise von Häusern in King County zwischen Mai 2014 und Mai 2015.
bevoelkerung.csv 161 10 Einwohnerzahlen Schweizer Städte von 1930 bis 2011.

kc_house.csv

Erste 5 Zeilen und 5 Spalten von kc_house.csv

preis schlafzimmer badezimmer qf_wohnraum qf_parzelle
221900 3 1.00 1180 5650
538000 3 2.25 2570 7242
180000 2 1.00 770 10000
604000 4 3.00 1960 5000
510000 3 2.00 1680 8080
Variable Beschreibung
preis Preis in USD
schlafzimmer Anzahl Schlafzimmer
badezimmer Anzahl Badezimmer
qf_wohnraum Wohnraumfläche in Quadratfuss
qf_parzelle Parzellengrösse in Quadratfuss
stoecke Anzahl Stöcke
ufer Ist das Haus am Ufer gebaut (1) oder nicht (0)
qf_dachstock Dachstockfläche in Quadratfuss
qf_keller Kellerfläche in Quadratfuss
baujahr Baujahr
postleitzahl Postleitzahl

bevoelkerung.csv

Erste 5 Zeilen und 5 Spalten von bevoelkerung.csv

Stadtname st_wbev_2011 st_wbev_2001 proz_ver-2001–2011 bevdichte
Basel 164516 164665 -0.1 69
Bern 125681 122211 2.8 24
Genève 188234 175697 7.1 119
Lausanne 129383 115272 12.2 31
Winterthur 103075 89484 15.2 15
Variable Beschreibung
Stadtname Name der Stadt
st_wbev_2011 Wohnbevölkerung im Jahr 2011
st_wbev_2001 Wohnbevölkerung im Jahr 2001
proz_ver-2001–2011 Veränderung der Einwohnerzahl in Prozent zwischen 2001 und 2011
bevdichte Bevölkerungsdichte
st_wbev_1930 Wohnbevölkerung im Jahr 1930
st_wbev_1970 Wohnbevölkerung im Jahr 1970
st_wbev_1980 Wohnbevölkerung im Jahr 1980
st_wbev_1990 Wohnbevölkerung im Jahr 1990
st_wbev_2000 Wohnbevölkerung im Jahr 2000

Funktionen

Pakete

Paket Installation Beschreibung
tidyverse install.packages("tidyverse") Ein Metapaket für Data Science, einschliesslich dplyr, ggplot2 und weitere Pakete

Funktionen

Wrangling

Funktion Paket Beschreibung
rename() dplyr Umbenennen von Spalten
select() dplyr Auswahl von Spalten basierend auf Name oder Index
filter() dplyr Auswahl von Zeilen basieren auf einem logischen Ausdruck
arrange() dplyr Sortiere Zeilen
mutate() dplyr Hinzufügen von Spalten
case_when() dplyr Recodieren von Spalten
group_by(), summarise() dplyr Gruppierung von Daten zur Berechnung deskriptiver Statistiken
pivot_longer() tidyr Transormation vom Wide ins Long Format
pivot_wider() tidyr Transormation vom Long ins Wide Format

Ressourcen

Vignettes

Hier geht es zur dplyr vignette und hier zur tidyr vignette.

Cheatsheet


von R Studio