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 |