|
Explorative Datenanalyse mit
R The R Bootcamp |
|
from
hillcountryeye.com
In diesem Practical wirst du üben Daten mit dplyr zu
transformieren und zu organisieren.
Am Ende des Practicals wirst du wissen wie man:
Öffne dein TheRBootcamp R project. Es sollte die
Ordner 1_Data und 2_Code enthalten.
Öffne ein neues R Skript. Schreibe deinen Namen, das Datum und “Wrangling Practical” als Kommentare an den Anfang des Skripts.
## NAME
## DATUM
## Wrangling Practical
Speichere das neue Skript unter dem Namen
wrangling_practical.R im 2_Code
Ordner.
Lade das tidyverse.
# Pakete laden
library(tidyverse)
library(tidyverse)
Verwende die read_csv() Funktion um den Datensatz
appointments als Objekt appointments
einzulesen. Denke an den Trick mit den Anführungszeichen (Cursor
zwischen die Anführungszeichen und dann Tab).
Printe den Datensatz. Wurden alle Variablentypen korrekt identifiziert?
Verwende summary() um einen weiteren Überblick über
die Daten zu bekommen.
rename()names() um die Spaltennamen von
appointments 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"
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)
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"
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)
names() ob alles stimmt.mutate()mutate(), um eine Spalte zu ergänzen, die das
Alter in Monaten kodiert, 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)
mutate(), um eine Spalte
krankheitsgrad zu ergänzen, die anzeigt wie viele
Erkrankungen der Patient hat. Addiere hierzu die Spalten
bluthochdruck, diabetes,
alkoholismus. Erinnere: TRUE = 1 und
FALSE = 0.# Kreiere Krankheitsgrad
appointments <- appointments %>%
mutate(XX = XX + XX + XX)
# Kreiere Krankheitsgrad
appointments <- appointments %>%
mutate(krankheitsgrad = bluthochdruck + diabetes + alkoholismus)
mutate() und case_when() um eine
Spalte schwer_krank zu ergänzen, die Ja
enthält, wenn jemand einen Krankheitsgrad von grösser 1 hat, und
ansonsten 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"
)
)
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"
)
)
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,
)
)
termin_eingehalten_01).# Anteil nicht wahrgenommener Termine
appointments %>%
filter(XX == XX) %>%
pull(XX) %>%
mean()
appointments %>%
filter(XX != XX) %>%
pull(XX) %>%
mean()
# Anteil nicht wahrgenommener Termine
appointments %>%
filter(schwer_krank == "Ja") %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.177
appointments %>%
filter(schwer_krank != "Ja") %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.204
# Anteil nicht wahrgenommener Termine
appointments %>%
filter(geschlecht == "männlich") %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.2
appointments %>%
filter(geschlecht != "männlich") %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.203
# Anteil nicht wahrgenommener Termine
appointments %>%
filter(alter_monate >= 360) %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.184
appointments %>%
filter(alter_monate < 360) %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.229
select(), filter(),
slice(), und arrange()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)
Printe appointments_reduziert. Sind die richtigen
Spalten enthalten?
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')
Printe appointments_reduziert$geschlecht. Sind noch
Männer enthalten?
Ergänze die Pipeline um nur solche Patientinnnen auszuwählen, die auch ü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)
Printe appointments_reduziert$alter_jahre. Sind noch
Jüngere enthalten?
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)
Printe appointments_reduziert und
appointments_reduziert$alter_jahre. Ist alles schön
sortiert?
Verwende arrange() und desc(), um
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))
Printe appointments_reduziert und
appointments_reduziert$alter_jahre. Ist alles schön
sortiert?
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))
Printe appointments_reduziert und
appointments_reduziert$krankheitsgrad. Ist alles schön
sortiert?
Ä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))
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)
appointments_reduziert. Sind es nun 20 Fälle?
Sind die ausgewählten Fälle zum Termin erschienen?*_join()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.
Printe den Datensatz. Wurden alle Variablentypen korrekt identifiziert?
Verwende summary() um einen weiteren Überblick über
die Daten zu bekommen.
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)
Printe weather_reduziert. Ist alles wie
gewünscht?
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)
Printe appointments_weather. Ist alles in
Ordnung?
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)
Printe appointments_weather. Ist alles in
Ordnung?
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,
)
)
Printe appointments_weather. Ist alles in
Ordnung?
Finde nun mit Hilfe des untenstehenden Codes heraus, ob Termine bei Regen seltener eingehalten wurden.
# Anteil nicht wahrgenommener Termine
appointments_weather %>%
filter(XX == XX) %>%
pull(XX) %>%
mean()
appointments_weather %>%
filter(XX != XX) %>%
pull(XX) %>%
mean()
# Anteil nicht wahrgenommener Termine
appointments_weather %>%
filter(niederschlag_01 == 1) %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.201
appointments_weather %>%
filter(niederschlag_01 != 1) %>%
pull(termin_eingehalten_01) %>%
mean()
[1] 0.23
appointments_weather zu
erstellen ohne auch nur einmal ein Objekt zwischendrin zuzuweisen.# kreire appointments_weather
read_csv("XX") %>%
...
# 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)))
| 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 |
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? |
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 |
| Package | Installation |
|---|---|
tidyverse |
install.packages("tidyverse") |
| 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 |