Trulli
from parkinsonsnewstoday.com

Overview

In diesem Practical wirst du üben Daten mit dplyr zu transformieren und zu organisieren.

Am Ende des Practicals wirst du wissen wie man:

  1. Spalten verändert, kreiert, auswählt.
  2. Fälle auswählt.
  3. Daten verbindet.

Aufgaben

A - Setup

  1. Öffne dein TheRBootcamp R project. Es sollte die Ordner 1_Data und 2_Code enthalten. Stelle sicher, dass du alle Datensätze, welche im Datensätze Tab aufgelisted sind, in deinem 1_Data Ordner hast.

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

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

  2. Lade das tidyverse Paket.

# Pakete laden
library(tidyverse)     
library(tidyverse)

B - Lade den Datensatz

  1. Verwende die read_csv() Funktion um den Datensatz appointments als Objekt appointments einzulesen. Denke an den Trick mit den Anführungszeichen.

  2. Printe den Datensatz. Wurden alle Variablentypen korrekt identifiziert?

  3. Verwende summary() um einen weiteren Überblick über die Daten zu bekommen.

C - Verändere Spaltennamen mit rename()

  1. Verwende names() um die Spaltennamen anzuzeigen.
# Zeige Spaltennamen
names(XXX)
# Zeige Spaltennamen
names(appointments)
 [1] "PatientId"      "AppointmentID"  "Gender"         "ScheduledDay"  
 [5] "AppointmentDay" "Age"            "Neighbourhood"  "Hypertension"  
 [9] "Diabetes"       "Alcoholism"     "Handicap"       "SMS_received"  
[13] "NoShow"        
  1. Eine der Spalten hat aktuell den namen Age. Verwende rename() um den Namen in alter_jahre zu ändern, so dass klar ist, dass es sich um das Alter in Jahren handelt.
# Ändere Age zu alter_jahre
appointments <- appointments %>%
  rename(NEU = ALT)
# Ändere Age zu alter_jahre
appointments <- appointments %>%
  rename(alter_jahre = Age)
  1. Verwende nochmals names() um dir die Namen anzeigen zu lassen. Hat sich der Name geändert?
names(appointments)
 [1] "PatientId"      "AppointmentID"  "Gender"         "ScheduledDay"  
 [5] "AppointmentDay" "alter_jahre"    "Neighbourhood"  "Hypertension"  
 [9] "Diabetes"       "Alcoholism"     "Handicap"       "SMS_received"  
[13] "NoShow"        
  1. Ergänze nun den Code unten, um alle Variablennamen ins Deutsche zu übersetzen.
appointments <- appointments %>%
  rename(patient = XX,
         termin_id = XX,
         geschlecht = XX,
         termin_vereinbart = XX,
         termin_tag = XX,
         geburtsort = XX,
         bluthochdruck = XX,
         diabetes = XX,
         alkoholismus = XX,
         behinderung = XX,
         sms_erhalten = XX,
         termin_eingehalten = XX)
appointments <- appointments %>%
  rename(patient = PatientId,
         termin_id = AppointmentID,
         geschlecht = Gender,
         termin_vereinbart = ScheduledDay,
         termin_tag = AppointmentDay,
         geburtsort = Neighbourhood,
         bluthochdruck = Hypertension,
         diabetes = Diabetes,
         alkoholismus = Alcoholism,
         behinderung = Handicap,
         sms_erhalten = SMS_received,
         termin_eingehalten = NoShow)
  1. Überprüfe mit names() ob alles stimmt.

D - Verändere Spalten mit mutate()

  1. Verwende mutate() um eine Spalte zu ergänzen, die das Alter in Monaten enthält, also alter_jahre * 12 und nenne die Spalte alter_monate.
# Alter in Monaten
appointments <- appointments %>%
  mutate(XX = XX * 12)
# Alter in Monaten
appointments <- appointments %>%
  mutate(alter_monate = alter_jahre * 12)
  1. Verwende mutate() um eine Spalte krankheitsgrad zu ergänzen, die anzeigt wie viele Erkrankungen der Patient hat. Addiere hierzu die Spalten bluthochdruck, diabetes, alkoholismus. Erinnere, dass gilt: TRUE = 1 und FALSE = 0.
# Kreiere Krankheitsgrad
appointments <- appointments %>%
  mutate(XX = XX + XX + XX)
# Kreiere Krankheitsgrad
appointments <- appointments %>%
  mutate(krankheitsgrad = bluthochdruck + diabetes + alkoholismus)
  1. Verwende mutate() und case_when() um eine Spalte schwer_krank zu ergänzen, die Ja trägt, wenn jemand einen Krankheitsgrad von grösser 1 hat, und sonst Nein.
# Kreiere schwer_krank
appointments <- appointments %>%
  mutate(schwer_krank = case_when(
    XX <= XX ~ "Nein",
    XX  > XX ~ "Ja"
    )
  )
# Kreiere schwer_krank
appointments <- appointments %>%
  mutate(schwer_krank = case_when(
    krankheitsgrad <= 1 ~ "Nein",
    krankheitsgrad  > 1 ~ "Ja"
    )
  )
  1. Verwende mutate() und case_when() um M und F in der Spalte geschlecht in männlich und weiblich zu verändern. Weise hierzu die entstehende Variable direkt wieder der Spalte geschlecht zu.
# Verändere geschlecht
appointments <- appointments %>%
  mutate(XX = case_when(
    XX == XX ~ XX,
    XX == XX ~ XX
    )
  )
# Verändere geschlecht
appointments <- appointments %>%
  mutate(geschlecht = case_when(
    geschlecht == "M" ~ "männlich",
    geschlecht == "F" ~ "weiblich"
    )
  )
  1. Verwende mutate() und case_when() um No und Yes in der Spalte termin_eingehalten in 0 respektive 1 zu verändern. Kreiere hierzu eine neue Spalte mit Namen termin_eingehalten_01.
# Termin eingehalten Yes = 1, No = 0
appointments <- appointments %>%
  mutate(XX = case_when(
    XX == XX ~ XX,
    XX == XX ~ XX
    )
  )
# Termin eingehalten Yes = 1, No = 0
appointments <- appointments %>%
  mutate(termin_eingehalten_01 = case_when(
    termin_eingehalten == "No" ~ 0,
    termin_eingehalten == "Yes" ~ 1,
    )
  )
  1. Finde mit der bekannten Form data_frame$spalte1[data_frame$spalte2 == XX] und der mean() Funktion heraus, ob schwerkranke Patienten häufiger den Termin nicht wahrnehmen (verwende termin_eingehalten_01).
# Anteil nicht wahrgenommener Termine
mean(XX$XX[XX$XX == XX])
mean(XX$XX[XX$XX != XX])
# Anteil nicht wahrgenommener Termine
mean(appointments$termin_eingehalten_01[appointments$schwer_krank == "Ja"])
[1] 0.177
mean(appointments$termin_eingehalten_01[appointments$schwer_krank != "Ja"])
[1] 0.204
  1. Vergleiche nun, ob es in den wahrgenommenen Terminen vielleicht Unterschiede zwischen Männern und Frauen gibt und ob es Unterschiede zwischen Patienten gibt, die mehr oder weniger als 360 Monate alt sind.
# Anteil nicht wahrgenommener Termine
mean(appointments$termin_eingehalten_01[appointments$geschlecht == "männlich"])
[1] 0.2
mean(appointments$termin_eingehalten_01[appointments$geschlecht != "weiblich"])
[1] 0.2

E - Organisieren mit select(), filter(), slice(), und arrange()

  1. Verwende select() um die Spalten patient, geschlecht, alter_jahre, krankheitsgrad und termin_eingehalten_01 auszuwählen. Speichere den resultierenden data frame als appointments_reduziert.
# Wähle Spalten aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX)
# Wähle Spalten aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01)
  1. Printe appointments_reduziert. Sind die richtigen Spalten enthalten?

  2. Verwende filter() um Fälle auszuwählen, in denen der Patient weiblich ist. Ergänze hierzu direkt die Pipeline.

# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX)
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich')
  1. Printe appointments_reduziert$geschlecht. Sind noch Männer enthalten?

  2. Ergänze die Pipeline um gleichzeitig nur Patienten auszuwählen, die über 30 Jahre alt sind.

# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX,
         XX > XX)
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich',
         alter_jahre > 30)
  1. Printe appointments_reduziert$alter_jahre. Sind noch Jüngere enthalten?

  2. Verwende arrange() um den appointments_reduziert Datensatz aufsteigend nach Alter zu ordnen. Ergänze die Pipeline.

# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX,
         XX > XX) %>%
  arrange(XX)
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich',
         alter_jahre > 30) %>%
  arrange(alter_jahre)
  1. Printe appointments_reduziert und appointments_reduziert$alter_jahre. Ist alles schön sortiert?

  2. Verwende arrange() und desc() um diesmal appointments_reduziert absteigend (descending) nach Alter zu ordnen.

# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX,
         XX > XX) %>%
  arrange(desc(XX))
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich',
         alter_jahre > 30) %>%
  arrange(desc(alter_jahre))
  1. Printe appointments_reduziert und appointments_reduziert$alter_jahre. Ist alles schön sortiert?

  2. Verwende arrange() und desc() um appointments_reduziert ebenfalls, absteigend (descending) nach krankheitsgrad zu ordnen.

# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX,
         XX > XX) %>%
  arrange(desc(XX),
          desc(XX))
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich',
         alter_jahre > 30) %>%
  arrange(desc(alter_jahre),
          desc(krankheitsgrad))
  1. Printe appointments_reduziert und appointments_reduziert$krankheitsgrad. Ist alles schön sortiert?

  2. Ändere die Reihenfolge von krankheitsgrad und alter_jahre in der arrange() Funktion um primär nach krankheitsgrad zu sortieren.

# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX,
         XX > XX) %>%
  arrange(desc(XX),
          desc(XX))
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich',
         alter_jahre > 30) %>%
  arrange(desc(krankheitsgrad),
          desc(alter_jahre))
  1. Verwende slice() um die ersten zwanzig Fälle in appointments_reduziert auszuwählen. Ergänze die Pipeline.
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(XX, XX, XX, XX, XX) %>%
  filter(XX == XX,
         XX > XX) %>%
  arrange(desc(XX),
          desc(XX)) %>%
  slice(XX:XX)
# Wähle Fälle aus
appointments_reduziert <- appointments %>%
  select(patient, geschlecht, alter_jahre, krankheitsgrad, termin_eingehalten_01) %>%
  filter(geschlecht == 'weiblich',
         alter_jahre > 30) %>%
  arrange(desc(krankheitsgrad),
          desc(alter_jahre)) %>%
  slice(1:20)
  1. Printe appointments_reduziert. Sind es nun 20 Fälle? Sind die ausgewählten Fälle zum Termin erschienen?

F - Verbinde Datensätze mit *_join()

  1. Verwende die read_csv() Funktion um den Datensatz weather, welcher Daten über das Wetter in Brasilien enthält, als Objekt weather einzulesen. Denke an den Trick mit den Anführungszeichen.

  2. Printe den Datensatz. Wurden alle Variablentypen korrekt identifiziert?

  3. Verwende summary() um einen weiteren Überblick über die Daten zu bekommen.

  4. Verwende select() und rename() um die Spalten YYYYMMDD und PRECTOT auszuwählen und sie in termin_tag und niederschlag umzubenennnen. Nenne das resultierende Objekt weather_reduziert

# Verarbeite weather
weather_reduziert <- weather %>%
  select(XX, XX) %>%
  rename(XX = XX,
         XX = XX) 
# Verarbeite weather
weather_reduziert <- weather %>%
  select(YYYYMMDD, PRECTOT) %>%
  rename(termin_tag = YYYYMMDD,
         niederschlag = PRECTOT) 
  1. Printe weather_reduziert. Ist alles wie gewünscht?

  2. Verwende left_join() um weather_reduziert mit den Spalten termin_tag und termin_eingehalten in appointments zu verbinden. Nenne den gemeinsamen Datensatz appointments_weather.

# Verbinde Datensätze
appointments_weather <- appointments %>%
  select(XX, XX) %>%
  left_join(XX)
# Verbinde Datensätze
appointments_weather <- appointments %>%
  select(termin_tag, termin_eingehalten) %>%
  left_join(weather_reduziert)
  1. Printe appointments_weather. Ist alles in Ordnung?

  2. Verwende select() um nach dem Verbinden die Spalten in die folgende Reihenfolge zu bringen: termin_tag, niederschlag, und termin_eingehalten.

# Verbinde Datensätze
appointments_weather <- appointments %>%
  select(XX, XX) %>%
  left_join(XX) %>%
  select(XX, XX, XX)
# Verbinde Datensätze
appointments_weather <- appointments %>%
  select(termin_tag, termin_eingehalten) %>%
  left_join(weather_reduziert) %>%
  select(termin_tag, niederschlag, termin_eingehalten)
  1. Printe appointments_weather. Ist alles in Ordnung?

  2. Erstelle im nächsten Schritt der Pipeline erneut eine Variable termin_eingelten_01 genauso wie du das vorher bereits einmal gemacht hast. Erstelle ausserdem eine Variable niederschlag_01 die anzeigt, ob es Niederschlag gab oder nicht.

# Verbinde Datensätze
appointments_weather <- appointments %>%
  select(XX, XX) %>%
  left_join(XX) %>%
  select(XX, XX, XX) %>%
  mutate(
    termin_eingehalten_01 = case_when(
      XX == XX ~ XX,
      XX == XX ~ XX,
      ),
    niederschlag_01 = case_when(
      XX == 0 ~ 0,
      XX > 0 ~ 1,
      )
  )
# Verbinde Datensätze
appointments_weather <- appointments %>%
  select(termin_tag, termin_eingehalten) %>%
  left_join(weather_reduziert) %>%
  select(termin_tag, niederschlag, termin_eingehalten) %>%
  mutate(
    termin_eingehalten_01 = case_when(
      termin_eingehalten == "No" ~ 0,
      termin_eingehalten == "Yes" ~ 1,
      ),
    niederschlag_01 = case_when(
      niederschlag == 0 ~ 0,
      niederschlag > 0 ~ 1,
      )
    )
  1. Printe appointments_weather. Ist alles in Ordnung?

  2. Finde nun mit der bekannten Form data_frame$spalte1[data_frame$spalte2 == XX] und der mean() Funktion heraus, ob Termine bei Regen seltener eingehalten wurden.

# Anteil nicht wahrgenommener Termine
mean(XX$XX[XX$XX == XX])
mean(XX$XX[XX$XX != XX])
# Anteil nicht wahrgenommener Termine
mean(appointments_weather$termin_eingehalten_01[appointments_weather$niederschlag_01 == 1])
mean(appointments_weather$termin_eingehalten_01[appointments_weather$niederschlag_01 != 1])

X - Challenge

  1. Versuche alle bisherigen Schritte beginnend beim einlesen bis zum Verbinden der Datensätze in eine einzige Pipeline zu bringen. Das Ziel ist es die letzte Version von appointments_weather zu erstellen ohne auch nur einmal ein Objekt zwischendrin zuzuweisen.
# kreire appointments_weather
read_csv("XX") %>%
  ...

Beispiele

# Wrangling mit dplyr ---------------------------

library(tidyverse)  

# Lade basel
basel <- read_csv("1_Data/basel.csv")

# dplyr Pipeline

basel %>%
  
  # Ändere Spaltennamen
  rename(alter_jahre = alter,
         schwimmen = rhein) %>%
  
  # Nur Leute über 30
  filter(alter_jahre > 30) %>%
  
  # Berechne neue Variablen
  mutate(gewicht_pfungd = gewicht * 2.22,
         groesse_meter = groesse / 100,
         BMI = gewicht / groesse_m ^ 2,
         
         # Binarisiere geschlecht
         geschlecht_01 = case_when(
                           geschlecht == "m" ~ 0,
                           geschlecht == "f" ~ 1),

        # Ist groesse groesser als 150cm
        groesse_150 = case_when(
                          groesse < 150 ~ 1,
                          groesse >= 150 ~ 0)) %>%
  
  # Sortiere die Daten
  arrange(geschlecht, desc(alter_jahre)))

Datensätze

Datei Zeilen Spalten Beschreibung
appointments.csv 110526 13 Datensatz zu eingehalten Arztterminen in Brasilien
weather.csv 41 10 Datensatz zum Wetter in Brasilien zur selben Zeit wie in appointments.csv

appointments.csv

Erste 5 Zeilen von appointments.csv

PatientId AppointmentID Gender ScheduledDay AppointmentDay Age Neighbourhood Hypertension Diabetes Alcoholism Handicap SMS_received NoShow
2.99e+13 5642903 F 2016-04-29 18:38:08 2016-04-29 62 JARDIM DA PENHA TRUE FALSE FALSE 0 FALSE No
5.59e+14 5642503 M 2016-04-29 16:08:27 2016-04-29 56 JARDIM DA PENHA FALSE FALSE FALSE 0 FALSE No
4.26e+12 5642549 F 2016-04-29 16:19:04 2016-04-29 62 MATA DA PRAIA FALSE FALSE FALSE 0 FALSE No
8.68e+11 5642828 F 2016-04-29 17:29:31 2016-04-29 8 PONTAL DE CAMBURI FALSE FALSE FALSE 0 FALSE No
8.84e+12 5642494 F 2016-04-29 16:07:23 2016-04-29 56 JARDIM DA PENHA TRUE TRUE FALSE 0 FALSE No
Variable Beschreibung
PatientId ID des Patienten
AppointmentID ID des Arzttermins
Gender M = Männlich, F = Weiblich
ScheduledDay Der Tag an dem der Termin vereinbart wurde
AppointmentDay Der Tag des Arzttermins
Age Wie alt ist der Patient
Neighbourhood Wo wurde der Patient geboren
Hypertension Bluthochdruck Ja, Nein
Diabetes Diabetes Ja, Nein
Alcoholism Alcoholismus Ja, Nein
Handcap Behinderung - Stufen 1 bis 4, 1 niedrigstes Level
SMS_received Hat der Patient eine Erinnerung per SMS erhalten?
No-show Ist der Patient zum Termin erschienen?

weather.csv

Erste 5 Zeilen von weather.csv

LON LAT YEAR MM DD DOY YYYYMMDD RH2M T2M PRECTOT
20.3 40.3 2016 4 29 120 2016-04-29 86.6 11.57 6.18
20.3 40.3 2016 4 30 121 2016-04-30 73.5 14.02 0.04
20.3 40.3 2016 5 1 122 2016-05-01 75.9 12.98 4.48
20.3 40.3 2016 5 2 123 2016-05-02 84.7 11.41 22.99
20.3 40.3 2016 5 3 124 2016-05-03 84.6 8.69 5.81
Variable Beschreibung
LON Längengrad
LAT Breitengrad
YEAR Jahr
MM Monat
DD Tag
DOY Tag des Jahres
YYYYMMDD Datum
RH2M Relative Feuchtigkeit auf 2 Metern
T2M Temperatur auf 2 Metern
PRECTOT Niederschlag

Funktionen

Pakete

Package Installation
tidyverse install.packages("tidyverse")

Funktionen

Function Package Description
rename() dplyr Spalten umbenennen
select() dplyr Spalten auswählen
filter(), slice() dplyr Fälle auswählen
arrange() dplyr Fälle sortieren
mutate() dplyr Spalten verändern / kreieren
case_when() dplyr Rekodiere Spalten

Resourcen

dplyr vignette

Siehe https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html für die dplyr vignette.

Cheatsheets


from R Studio