Explorative Datenanalyse mit R @ CSS The R Bootcamp |
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. Stelle sicher, dass du alle Datensätze, welche im Datensätze
Tab aufgelisted sind, in deinem 1_Data
Ordner hast.
Ö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
Paket.
# 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.
Printe den Datensatz. Wurden alle Variablentypen korrekt identifiziert?
Verwende summary()
um einen weiteren Überblick über die Daten zu bekommen.
rename()
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"
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 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)
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)
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"
)
)
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,
)
)
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
# 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
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 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)
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 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))
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 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])
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 |
dplyr
vignetteSiehe https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html für die dplyr
vignette.
from R Studio