CSV-Datei importieren
# Datei ist im Arbeitsverzeichnis
kabeljau <- read.csv(file = "Wachstum-Futter.csv")
# Alternativ: Angabe des Dateipfads
kabeljau <- read.csv(file = "Pfad/zur/Datei/Wachstum-Futter.csv")
Data Science 1 - Programmieren & Visualisieren
Saskia Otto & Monika Eberhard
Universität Hamburg, IMF
Wintersemester
![]()

Die Datenaufbereitung
Modifiziert von: R for Data Science von Wickham & Grolemund, 2017 (lizenziert unter CC-BY-NC-ND 3.0 US).

Note
Meistens werden flache Dateien in R importiert (sprich ohne interne Hierarchien und Beziehungen wie in Datenbanken).
read.table()→ Liest eine Datei im Tabellenformat ein und erstellt daraus einen Dataframe:
| Funktion | Details |
|---|---|
read.table(file, header = FALSE, sep = "", dec = ".") |
Importiert Datei im Tabellenformat (Leerzeichen-separiert) |
read.csv(file, header = TRUE, sep = ",", dec = ".") |
Importiert CSV-Datei (Komma-separiert) |
read.csv2(file, header = TRUE, sep = ";", dec = ",") |
Importiert CSV-Datei (Semikolon-separiert, Komma als Dezimalzeichen) |
read.delim(file, header = TRUE, sep = "\\t", dec = ".") |
Importiert Tab-separierte Textdatei |
read.delim2(file, header = TRUE, sep = "\\t", dec = ",") |
Importiert Tab-separierte Textdatei (mit Komma als Dezimalzeichen) |
![]()
read.csv():str(), head()/tail(), View() und summary():'data.frame': 11 obs. of 2 variables:
$ Verzehr : num 1868 140 256 719 1714 ...
$ Wachstum: num 482.2 -90.5 -40.3 236 512.7 ...
Verzehr Wachstum
1 1868.0 482.2
2 140.3 -90.5
3 255.6 -40.3
4 718.8 236.0
5 1714.4 512.7
6 1149.1 296.6
Verzehr Wachstum
Min. : 140.3 Min. :-90.50
1st Qu.: 323.8 1st Qu.:-15.05
Median : 718.8 Median :198.00
Mean : 856.2 Mean :180.02
3rd Qu.:1323.5 3rd Qu.:349.80
Max. :1868.0 Max. :512.70
URL statt Dateiname angeben
'data.frame': 8 obs. of 22 variables:
$ Schiff : chr "Alkor" "Alkor" "Alkor" "Alkor" ...
$ Reise : int 551 551 551 551 551 551 551 551
$ Station : chr "43-3" "43-3" "43-3" "43-3" ...
$ Hol : int 9 9 9 9 9 9 9 9
$ Datum : chr "10.03.2021" "10.03.2021" "10.03.2021" "10.03.2021" ...
$ Startzeit : chr "11:36:00" "11:36:00" "11:36:00" "11:36:00" ...
$ Endzeit : chr "12:21:00" "12:21:00" "12:21:00" "12:21:00" ...
$ Schleppdauer : int 45 45 45 45 45 45 45 45
$ Fangbeginn_Breite : num 54.5 54.5 54.5 54.5 54.5 ...
$ Fangbeginn_Laenge : num 11.3 11.3 11.3 11.3 11.3 ...
$ Hieven_Breite : num 54.5 54.5 54.5 54.5 54.5 ...
$ Hieven_Laenge : num 11.4 11.4 11.4 11.4 11.4 ...
$ Fanggeraet : chr "JFT" "JFT" "JFT" "JFT" ...
$ Wassertiefe : int 30 30 30 30 30 30 30 30
$ Fangtiefe : num 26.5 26.5 26.5 26.5 26.5 26.5 26.5 26.5
$ Netzoeffnung : num 3.5 3.5 3.5 3.5 3.5 3.5 3.5 3.5
$ Grundtau_Boden : int 0 0 0 0 0 0 0 0
$ Schleppgeschw : num 2.6 2.6 2.6 2.6 2.6 2.6 2.6 2.6
$ Globalstrahlung : int 380 380 380 380 380 380 380 380
$ Gesamtgewicht_Hol_kg: num 61.5 61.5 61.5 61.5 61.5 ...
$ Art : chr "Hering" "Sprotte" "Dorsch" "Wittling" ...
$ Gesamtzahl : int 50 6565 3 2 1 149 49 1
Wenn Sie Ihre Daten exportieren wollen, um sie dann mit anderen Programmen zu bearbeiten, verwenden Sie am besten das gleiche Format wie beim Import.
Die meisten Importfunktionen haben ein Äquivalent zum Exportieren:
write.table(), write.csv(), write.csv2() Verzehr Wachstum Ratio
1 1868.0 482.2 0.2581370
2 140.3 -90.5 -0.6450463
3 255.6 -40.3 -0.1576682
Nach Veränderung → im gleichen CSV-Format abspeichern und später in z.B. Calc öffnen:
Objekte lassen sich auch im R-eigenen Format speichern - dabei bleiben z.B. Datentypen und Faktorstufen erhalten:
.rds→ Mit save()/load() lassen sich beliebig viele Objekte (auch Listen und Funktionen) in einer Datei speichern. Sie erhalten beim Laden aber immer ihren ursprünglichen Namen - vorhandene Objekte mit gleichem Namen werden dabei überschrieben!


Was haben wir gerade gelernt?
# ------------------------------ Vorbereitung ----------------------------------
#### Laden von Paketen
library(tidyverse)
# library(readODS)
# library(readxl)
library(DSBtools)
options(DSBtools.language = "de") # Ausgabe auf Deutsch
#### Eigene Funktionen
# -------------------- Import und Datenaufbereitung ----------------------------
#### Import einer Textdatei im CSV-Format (das gängigste Format)
kabeljau_csv <- read.csv(file = "data/Wachstum-Futter.csv")
str(kabeljau_csv) # --> Output ist ein data frame
#### Import von Calc- und Excel-Dateien (ODS- und XLSX-Format)
# Import einer ODS-Datei mit dem 'readODS' Paket
kabeljau <- readODS::read_ods("data/DS1_W03_Streudiagramm_Kabeljau.ods",
sheet = "Daten_Visualisierung")
str(kabeljau) # --> Output ist ein Tibble
# Import einer XLSX-Datei mit z.B. dem 'readxl' Paket
kabeljau_xlsx <- readxl::read_excel("data/DS1_W03_Streudiagramm_Kabeljau.xlsx",
sheet = "Daten_Visualisierung")
str(kabeljau_xlsx) # --> Output ist ein Tibble
#### Datensichtung und -transformation
# Anpassen der Spaltennamen
names(kabeljau) <- c("verzehr", "wachstum")
str(kabeljau)
# Wertebereich prüfen
summary(kabeljau)
# Beziehung explorieren: Ist sie linear? Gibt es Ausreisser?
explore_var(x = kabeljau$verzehr, y = kabeljau$wachstum,
xlab = "Verzehr/Konsum (J/g/Tag)", ylab = "Wachstum (J/g/Tag)")
# ---------------------- Lineare Regression: Berechnung ------------------------
# (-> Lektion L03 in DSB-02-Datenexploration mit R)
#### Manuelle Berechnung
# Um Tipparbeit zu sparen, speichern wir die Spalten als einzelne Vektoren
x <- kabeljau$verzehr
y <- kabeljau$wachstum
# Steigungsparameter b berechnen
b <- cov(x = x, y = y)/ var(x) # der shortcut mit der Kovarianz und Varianz
b
# Achsenabschnitt a berechnen
a <- mean(y) - b*mean(x)
a
# Das Bestimmtheitsmass R^2 berechnen
y_pred <- a + b*x # die vorhergesagten Werte
ss_gesamt <- sum( (y - mean(y))^2 ) # Summenquadrate Gesamt
ss_regression <- sum( (y_pred - mean(y))^2 ) # Summenquadrate der Regression
R2 <- round(ss_regression/ss_gesamt, 4)
R2
##### Zum Vergleich die Regression automatisch berechnen mit lm()
# Erstellung des Modells
mod <- lm(formula = wachstum ~ verzehr, data = kabeljau)
mod
# Ausgabe nur der beiden Koeffizienten
coef(mod)
# Ausgabe aller wichtigen Statistiken des Modells, inklusive von R^2
# (mehr dazu in Data Science 2)
summary(mod)
# ------------------- Lineare Regression: Visualisierung ----------------------
#### Visualisierung mit den Basisfunktionen (-> Lektion L02 und L03 in DSB-02)
# Sog. high-level Funktion plot()
plot(x = kabeljau$verzehr, y = kabeljau$wachstum,
pch = 15, cex = 1.2, col = "#004586",
xlab = "Verzehr/Konsum (J/g/Tag)", ylab = "Wachstum (J/g/Tag)")
# Sog. low-level Funktionen, die Elemente in den angezeigten Plot einfügen
abline(a = a, b = b)
title(
main = paste0("wachstum = ", round(a, 3), " + ", round(b, 3), "*verzehr"),
sub = paste0("Bestimmtheitsmaß R^2 = ", R2)
) # (paste0() verkettet Zeichen miteinander)
#### Visualisierung mit ggplot2 (-> siehe swirl-Kurs DSB-04)
kabeljau |>
ggplot(aes(x = verzehr, y = wachstum)) + # initiert Plot
geom_point(colour = "#004586", shape = 15, size = 3) +
# Punktelemente hinzufügen
geom_abline(slope = b, intercept = a) +
# Achsenbeschriftung anpassen und Titel hinzufügen
labs(x = "Verzehr/Konsum (J/g/Tag)", y = "Wachstum (J/g/Tag)",
title = str_c("wachstum = ", round(a, 3), " + ", round(b, 3), "*verzehr"),
subtitle = str_c("Bestimmtheitsmaß R^2 = ", R2)) +
# das Layout anpassen
theme_bw()DS1_W04_Demo_LineareRegression_Kabeljau.R

Was haben wir gerade gelernt?
# ------------------------------ Vorbereitung ----------------------------------
#### Laden von Paketen
library(tidyverse) # laedt 9 Pakete
# # (das gleiche wie alle Pakete einzeln zu laden)
# library(dplyr)
# library(forcats)
# library(ggplot2)
# library(lubridate)
# library(purrr)
# library(readr)
# library(stringr)
# library(tibble)
# library(tidyr)
library(DSBtools)
options(DSBtools.language = "de") # Ausgabe auf Deutsch
#### Eigene Funktionen
# Variantionskoeffizient
cv <- function(x) {
sd(x)/mean(x)
}
# -------------------- Import und Datenaufbereitung ----------------------------
#### Import von CSV-Dateien
# (-> Swirl-Lektion L01 in DSB-03-Datenaufbereitung oder per Anleitung durchs Tidyversum)
# Import der ODS-Datei, welche in den Zeilen 66-68 noch Text enthaelt
iris <- readODS::read_ods("data/DS1_W03_Saeulendiagramm_mit_iris.ods")
#### Prüfung des Imports und Datensichtung
# (-> Swirl-Lektion L02 in DSB-03)
# Prüfung des Datentyps --> IMMER DIREKT NACH DEM IMPORT VERWENDEN!
str(iris) # str = structure
# Betrachtung des Inhalts
iris
# View(iris)
# Korrektur des Datentyps und der Zeilen
iris <- iris[1:60, ] |>
mutate(across(Sepal.Length:Petal.Width, as.numeric)) |>
mutate(Species = as.factor(Species))
str(iris)
# Welche Werte kommen in jeder Spalte vor?
lapply(iris, unique)
### Weitere Funktionen zur Sichtung einzelner Aspekte
head(iris) # zeigt erste 6 Zeilen (Kopfzeilen)
tail(iris) # zeigt letzte 6 Zeilen (Endzeilen)
class(iris) # Identifikation der Objektklasse (Vektor, Matrix, dataframe,..)
nrow(iris) # Anzahl Zeilen
ncol(iris) # Anzahl Spalten
dim(iris) # Anzahl aller Dimensionen
names(iris) # Spaltennamen
typeof(iris$Sepal.Length) # Datentyp von Spalte 'Sepal.Length'
typeof(iris$Species) # Datentyp von Spalte 'Species'
# ----------------------- Deskriptive Statistik --------------------------------
#### Berechnung mehrerer Statistiken für jede Spalte im data frame
# Klassische Zusammenfassung mit base R (Ausgabe nur in der Konsole)
summary(iris)
# Shortcut mit DSBtools: Statistiken für jede Spalte, passend zum erkannten
# Variablentyp (z.B. Häufigkeiten bei 'Species', Mittelwert & Co. bei den
# metrischen Spalten). Das Ergebnis ist ein Objekt, mit dem Sie weiterarbeiten
# können - speichern Sie es dazu unter einem Namen:
describe_df(data = iris)
#### Berechnung versch. Statistiken der Kronblattlaenge, gruppiert nach Art
# (-> Lektion L01 in DSB-02-Datenexploration mit R)
# (-> Lektion L06-Gruppierte Aggregation in DSB-03)
iris_summary <- iris |>
group_by(Species) |>
summarise(
PL_mean = mean(Petal.Length), # Mittelwert
PL_median = median(Petal.Length), # Median
PL_var = var(Petal.Length), # Varianz
PL_sd = sd(Petal.Length), # Standardabweichung
PL_se = sd(Petal.Length)/sqrt(length(Petal.Length)), # Standardfehler
PL_cv = cv(Petal.Length) # Variationskoeffizient
) |>
# die Artnamen anpassen (hier Gattungsnamen anfügen) und als Faktor speichern
mutate(Species = factor(paste0("Iris ", Species))) |>
# nun die Reihenfolge der Faktorstufen nach PL_mean sortieren
mutate(Species = fct_reorder(.f = Species, .x = PL_mean, .desc = TRUE))
# Zusammenfassung ansehen
iris_summary
# Kontrolle mit DSBtools: Stimmen Ihre Werte? describe_var() berechnet die
# Statistiken der Variable 'x' getrennt für jede Gruppe in 'by'
# (Angaben zum 95%-Konfidenzintervall -> kommt in Data Science 2)
iris_stats <- describe_var(x = iris$Petal.Length, by = iris$Species)
iris_stats
#### Saeulendiagramm erstellen mit dem 'ggplot2' Paket
# (siehe auch swirl-Kurs DSB-04-Datenvisualisierung mit ggplot2)
iris_summary |>
ggplot(aes(x = Species, y = PL_mean)) + # initiert Plot
# die Saeulen hinzufügen
geom_col(fill = "#004586") +
# die Fehlerbalken hinzufügen
geom_errorbar((aes(ymin = PL_mean - PL_sd, ymax = PL_mean + PL_sd)),
width = 0.2) +
# Achsenbeschriftung anpassen
ylab("Kronblattlänge (in cm)") +
xlab("Schwertlilienart (Gattung Iris)") +
# das Layout anpassen
theme_bw()DS1_W04_Demo_DeskriptiveStatistik_iris.R
Ist eine Sammlung von R Paketen, die die gleiche Philosophie teilen und aufeinander abgestimmt sind:
Modifiziert von: R for Data Science von Wickham & Grolemund, 2017 (lizenziert unter CC-BY-NC-ND 3.0 US).
Am einfachsten ist die Installation (und das spätere Laden) eines einzigen Paketes, welches weitere Pakete installiert und später lädt, mit:
readr::write_csv() keine Zeilennamen mit - bei write.csv() muss man dafür row.names = FALSE setzen
library() und require().library() bricht mit einer Fehlermeldung ab,require() gibt nur eine Warnung aus (und FALSE zurück) - der restliche Code läuft weiter.library(), dann merken Sie sofort, wenn etwas fehlt.![]()
Wenn ein spezifisches Paket geladen wird, wird es als ‘default’ zum Suchpfad hinzugefügt:

Modifiziert von: Advanced R von H. Wickham, 2014
![]()
Sie können sich den Suchpfad explizit anzeigen lassen mit search().
[1] ".GlobalEnv" "tools:rstudio" "package:stats"
[4] "package:graphics" "package:grDevices" "package:utils"
[7] "package:datasets" "package:methods" "Autoloads"
[10] "package:base"
Beim Laden von tidyverse werden 9 weitere ‘tidyverse’ Pakete mit geladen (es wird dabei auch ein Konflikt mit Funktionsnamen angezeigt - filter() und lag() existieren in 2 Paketen):
── Attaching core tidyverse packages ──────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.6
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.1 ✔ tibble 3.3.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.2
✔ purrr 1.2.1
── Conflicts ────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package to force all conflicts to become errors(Die Versionsnummern können bei Ihnen abweichen.)
Wir lassen uns den Suchpfad noch mal anzeigen:
[1] ".GlobalEnv" "package:lubridate" "package:forcats"
[4] "package:stringr" "package:dplyr" "package:purrr"
[7] "package:readr" "package:tidyr" "package:tibble"
[10] "package:ggplot2" "package:tidyverse" "tools:rstudio"
[13] "package:stats" "package:graphics" "package:grDevices"
[16] "package:utils" "package:datasets" "package:methods"
[19] "Autoloads" "package:base"
10 Pakete wurden insgesamt hinzugefügt (direkt nach der globalen Umgebung): das Paket tidyverse selbst und die Pakete lubridate, forcats, stringr, dplyr, purrr, readr, tidyr, tibble und ggplot2.
Pakete werden aus dem Suchpfad mit detach() entfernt - dabei muss package: vor den Paketnamen gesetzt werden:
Oder indem die Box neben dem Paketnamen im ‘Packages’ Fenster entfernt wird:

?packagename (z.B. ?tidyverse) aufrufen, erhalten Sie weitere Informationen zu den Kernaufgaben des Pakets und den verfügbaren Funktionen. Manchmal gibt es auch Weblinks für weitere Infos.Hilfreiche Vignetten
vignette("packagename").browseVignettes("packagename").![]()
![]()



tidyr::drop_na(data, ...): Entfernt alle Zeilen, die fehlende Werte enthalten. tidyr::fill(data, ..., .direction = c("down", "up")): Füllt fehlende Werte mit den vorherigen (direction = “down”) oder nachfolgenden (direction = “up”) Einträgen auf. tidyr::replace_na(data, replace = list(), ...): Ersetzt fehlende Werte mit einem spezifischen Wert für jede Spalte.
![]()
![]()
Gegeben sind folgende hydrografische Messungen der Ostsee-Station 1321 vom August 2015:
station lat long depth pres temp psal doxy
1 1321 55 13.3 47 0.2 17.93 8.167 NA
2 1321 55 13.3 47 1.0 NA NA NA
3 1321 55 13.3 47 5.0 NA 8.328 4.60
4 1321 55 13.3 47 10.0 17.49 8.349 4.50
5 1321 55 13.3 47 15.0 17.44 NA 4.50
6 1321 55 13.3 47 20.0 17.04 8.340 4.50
7 1321 55 13.3 47 25.0 NA 8.303 4.60
8 1321 55 13.3 47 30.0 15.56 NA 4.60
9 1321 55 13.3 47 35.0 11.29 7.915 4.78
10 1321 55 13.3 47 40.0 NA 8.417 NA
11 1321 55 13.3 47 45.0 11.19 NA NA
pres = Druck, temp = Temperatur, psal = Salinität, doxy = gelöster Sauerstoff
pres temp psal doxy
1 0.2 17.93 8.167 4.60
2 1.0 17.93 8.167 4.60
3 5.0 17.93 8.328 4.60
4 10.0 17.49 8.349 4.50
5 15.0 17.44 8.349 4.50
6 20.0 17.04 8.340 4.50
7 25.0 17.04 8.303 4.60
8 30.0 15.56 8.303 4.60
9 35.0 11.29 7.915 4.78
10 40.0 11.29 8.417 4.78
11 45.0 11.19 8.417 4.78
pres temp psal doxy
1 0.2 17.93 8.167 4.60
2 1.0 17.04 8.328 4.60
3 5.0 17.04 8.328 4.60
4 10.0 17.49 8.349 4.50
5 15.0 17.44 8.328 4.50
6 20.0 17.04 8.340 4.50
7 25.0 17.04 8.303 4.60
8 30.0 15.56 8.328 4.60
9 35.0 11.29 7.915 4.78
10 40.0 17.04 8.417 4.60
11 45.0 11.19 8.328 4.60


Das ‘tidyr’ Paket bietet zwei Funktionen für den Wechsel des Formats:
pivot_longer() (ehemals gather())pivot_wider() (ehemals spread())pivot_longer() → bewegt Spaltennamen in eine Schlüsselspalte und rafft die Werte der Spalten in eine einzelne Spalte zusammen.
irisAus dem Dataframe ist ein Tibble geworden - das machen alle tidyverse-Funktionen so (dazu gleich mehr).
# A tibble: 600 × 3
Species Leaf.Param Size
<fct> <chr> <dbl>
1 setosa Sepal.Length 5.1
2 setosa Sepal.Width 3.5
3 setosa Petal.Length 1.4
4 setosa Petal.Width 0.2
5 setosa Sepal.Length 4.9
6 setosa Sepal.Width 3
7 setosa Petal.Length 1.4
8 setosa Petal.Width 0.2
9 setosa Sepal.Length 4.7
10 setosa Sepal.Width 3.2
11 setosa Petal.Length 1.3
12 setosa Petal.Width 0.2
# ℹ 588 more rows
read_csv() & Co. (readr) sowie mit readODS oder readxlas_tibble():[1] "data.frame"
[1] "tbl_df" "tbl" "data.frame"
Ein ‘Tibble’ ist weiterhin ein ‘Dataframe’, hat aber zusätzlich die Klassen ‘tbl_df’ und ‘tbl’.
Standardmäßig zeigt ein ‘Tibble’ nur die ersten 10 Zeilen und alle Spalten, die in die Konsole passen. Mit print() lässt sich das ändern:
# A tibble: 150 × 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3 1.4 0.2 setosa
# ℹ 148 more rows
Mehr zu ‘Tibbles’: vignette("tibble")

→ separate() wurde in neueren tidyr-Versionen durch separate_wider_delim() abgelöst (‘superseded’), funktioniert aber weiterhin.
![]()
![]()
Warum sind pivot_longer() und pivot_wider() nicht perfekt symmetrisch? Begutachten Sie sorgfältig folgenden Datensatz (hier wieder ein Tibble):
# A tibble: 9 × 3
year quarter stock_return
<dbl> <int> <dbl>
1 2014 2 0.97
2 2014 3 1.13
3 2014 4 0.77
4 2015 1 0.61
5 2015 2 0.77
6 2015 3 1
7 2015 4 0.95
8 2016 1 0.79
9 2016 2 1.36
Vervollständigen Sie den Code, um den Datensatz in folgendes Format zu bringen:
# A tibble: 3 × 5
year `2` `3` `4` `1`
<dbl> <dbl> <dbl> <dbl> <dbl>
1 2014 0.97 1.13 0.77 NA
2 2015 0.77 1 0.95 0.61
3 2016 1.36 NA NA 0.79
Vervollständigen Sie den Code, um den Datensatz zurück ins ursprüngliche Format zu bringen.
# A tibble: 12 × 3
year quarter stock_return
<dbl> <chr> <dbl>
1 2014 2 0.97
2 2014 3 1.13
3 2014 4 0.77
4 2014 1 NA
5 2015 2 0.77
6 2015 3 1
7 2015 4 0.95
8 2015 1 0.61
9 2016 2 1.36
10 2016 3 NA
11 2016 4 NA
12 2016 1 0.79
Zurück zur Eingangsfrage: Warum sind pivot_longer() und pivot_wider() nicht perfekt symmetrisch?
![]()
# A tibble: 9 × 2
time stock_return
<chr> <dbl>
1 2/2014 0.97
2 3/2014 1.13
3 4/2014 0.77
4 1/2015 0.61
5 2/2015 0.77
6 3/2015 1
7 4/2015 0.95
8 1/2016 0.79
9 2/2016 1.36
# A tibble: 9 × 3
quarter year stock_return
<chr> <chr> <dbl>
1 2 2014 0.97
2 3 2014 1.13
3 4 2014 0.77
4 1 2015 0.61
5 2 2015 0.77
6 3 2015 1
7 4 2015 0.95
8 1 2016 0.79
9 2 2016 1.36

![]()
![]()

Alle Aufgaben der Übungswoche finden Sie im Handbuch:

Cheatsheet zum readr Paket frei verfügbar unter diesem Link.
Cheatsheet zum tidyr Paket frei verfügbar unter diesem Link.
Enthält wichtigste Funktionen der Datenaufbereitung.
Download Link über die DSB Website (alternativ auch im Moodle-Kurs)
Dann testen Sie doch Ihr Wissen in folgendem Abschlussquiz…
![]()
Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de

Diese Arbeit ist lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.
Kurswebseite: Data Science 1