---
fontsize: 8pt
format:
  beamer:
    include-in-header: ../PP_Header.tex
bibliography: ../PP_Referenzen.bib
---


# {.plain}

\center
```{r, echo = F, out.width = "20%"}
knitr::include_graphics("../OvGU_Logo.png")
```

\vspace{1mm}
\huge
Programmieren für Psychologie

\vspace{6mm}
\large
MSc Umweltpsychologie/Mensch-Technik-Interaktion

MSc Klinische Psychologie und Psychotherapie

MSc Psychologie

\vspace{6mm}
\normalsize
Joram Soch | Wintersemester 2026/2027


# {.plain}
\vfill
\center
\huge
\textcolor{black}{(6) Datenmanagement}
\vfill


# AGENDA {.plain}
\large
\setstretch{2.5}
\vfill

Daten

FAIR Prinzipien

Datenformate

Verzeichnismanagement

Datenimport und Datenexport


# Daten ====================================== {.plain}
\AtBeginSection{}
\section{Daten}
\setstretch{2.5}
\large
\vfill

**Daten**

FAIR Prinzipien

Datenformate

Verzeichnismanagement

Datenimport und Datenexport


# Beispiele für Daten
\setstretch{2}
\large

:::: {.columns}

::: {.column width="45%"}
\begin{itemize}
\item Zahlenarrays
\item Characterarrays
\item Software
\item Digitale Werkzeuge
\item Workflows
\item Analysispipelines
\item u.v.a.m.
\end{itemize}
:::

::: {.column width="40%"}
![](Abbildungen/pds_6_data.pdf){width="70%"}
:::

::::


# Forschungsdaten

"Grundsätzlich handelt es sich bei \textcolor{darkblue}{Forschungsdaten} um elektronisch repräsentierte analoge oder digitale Daten, die im Zuge wissenschaftlicher Vorhaben entstehen oder genutzt werden, z.B. durch Beobachtungen, Experimente, Simulationsrechnungen, Erhebungen, Befragungen, Quellenforschungen, Aufzeichnungen von Audio- und Videosequenzen, Digitalisierung von Objekten, und Auswertungen."

\vspace{6mm}
\footnotesize
\flushright
@ratfurinformationsinfrastrukturen2017
\vfill

[\textcolor{linkblue}{Empfehlungen zur Nutzung und Verwertung von Daten im wissenschaftlichen Raum  (09/2021)}](https://rfii.de/download/nutzung-und-verwertung-von-daten-im-wissenschaftlichen-raum-september-2021/)

[\textcolor{linkblue}{Herausforderung Datenqualität (11/2019)}](https://www.rfii.de/download/herausforderung-datenqualitaet-november-2019/)

[\textcolor{linkblue}{Digitale Kompetenzen – dringend gesucht! (07/2019)}](https://www.rfii.de/download/digitale-kompetenzen-dringend-gesucht/)

[\textcolor{linkblue}{Aktuelle Empfehlungen zu Datenschutz und Forschungsdaten (03/2017)}](https://www.rfii.de/download/rfii-empfehlungen-2017-datenschutz-und-forschungsdaten/)


# FAIR Prinzipien ====================================== {.plain}
\AtBeginSection{}
\section{FAIR Prinzipien}
\setstretch{2.5}
\large
\vfill

Daten

**FAIR Prinzipien**

Datenformate

Verzeichnismanagement

Datenimport und Datenexport


# Das FAIR Datenideal

\vspace{1cm}
![](Abbildungen/pds_6_fair_datenideal.pdf){width="69%" fig-align="center"}

\begin{center}
für Menschen und Maschinen
\end{center}


# Ursprung und Dokumentation

\normalsize

\vspace{5mm}
Das \textcolor{darkblue}{FAIR Ideal} zum Forschungsdatenmanagement hat seinen Ursprung in Diskussionen im Rahmen der [\textcolor{linkblue}{FORCE11}](https://www.force11.org/) Konferenzserie [\textcolor{linkblue}{„Jointly designing a data fairport“}](https://www.dtls.nl/2014/01/20/jointly-designing-data-fairport/) und durch @wilkinson2016 akademisch kommuniziert. 

\vspace{5mm}
Die [\textcolor{linkblue}{Fair Prinzipien}](https://www.go-fair.org/fair-principles/) besagt im Kern, dass Forschungsdaten Findable, Accessible, Interoperable, und Reusable für Menschen und Maschinen aufbereitet und vorgehalten werden sollen. Speziell formuliert das FAIR Datenideal folgende Ansprüche an das Management von Forschungs(meta)daten.


# Metadaten

\vspace{2mm}
\textcolor{darkblue}{Metadaten} repräsentieren Information über andere Daten. Man unterscheidet dabei beispielsweise deskriptive, strukturelle und administrative Metadaten [@riley2017; @ulrich2022].

\vspace{2mm}
**Deskriptive Metadaten** dienen dem Auffinden und der Identifikation einer Datenquelle. Beispiele sind etwa Titel der einer wissenschaftlichen Publikation oder ihr digital object identifier [DOI, @rosenblatt1997]. DOIs sind alphanumerische Kennungen, die digitale Objekte eindeutig identifizieren und als persistente Links zu Objekten im Internet funktionieren.

\vspace{2mm}
**Strukturelle Metadaten**  sind Metadaten über Datencontainer und repräsentieren den strukturellen Aufbau einer Datenquelle. Beispiele sind die Ordnung der Seiten eines Buches oder die for-Schleifenenkodierung dreidimensionaler Datenobjekte.

\vspace{2mm}
**Administrative Metadaten** sind Daten, die das Management einer Datenquelle
erleichtern. Beispiele sind die Provenienz, das Dateiformat, die Zugangsrechte,
oder weitere technische Informationen zu einer Datenquelle.
\vfill


# Findability (Auffindbarkeit)

\setstretch{2.4}
\justifying

F1. (Meta)Daten haben einen persistenten global einzigartigen Identifikator.

F2. Daten werden mit Metadaten angereichert.

F3. Metadaten sind zweifelsfrei einem Datensatz zuzuordnen.

F4. (Meta)Daten sind in einer durchsuchbaren Ressource indexiert.


# Accessibility (Zugänglichkeit)

\setstretch{2.4}
\justifying

A1. (Meta)Daten sind mit standardisierten Protokollen abrufbar.

A1.1. Das genutzte Protokoll ist offen, kostenlos und nutzbar.

A1.2. Das Protokoll ermöglicht Authentifizierung und Rechtevergabe.

A2. Metadaten bleiben zugänglich, auch wenn Daten nicht mehr vorliegen.


# Interoperability (Interoperabilität)

\setstretch{2.4}
\justifying

I1. (Meta)Daten nutzen eine formale, zugängliche, gemeinsam genutzte und breit anwendbare Sprache zur Wissensrepräsentation.

I2. (Meta)Daten nutzen Vokabularien, die den FAIR-Prinzipien folgen.

I3. (Meta)Daten enthalten qualifizierte Referenzen auf andere (Meta)Daten.


# Reusability (Wiederverwendbarkeit)

\setstretch{2.4}
\justifying

R1. (Meta)Daten haben eine Vielzahl genauer und relevanter Attribute.

R1.1. (Meta)Daten enthalten eine eindeutige Nutzungslizenz.

R1.2. (Meta)Daten enthalten detaillierte Provenienz-Informationen.

R1.3. (Meta)Daten genügen den Standards der jeweiligen Fachcommunity.


# FAIR Prinzipien -- Fazit

\setstretch{1.8}

\small
* Der Anspruch an ein FAIRes Forschungsdatenmanagement ist mittlerweile recht verbreitet.
* Die Umsetzung der FAIR-Prinzipien kann mehr oder weniger bürokratisch ausfallen.
* Die FAIR Prinzipien sind ein anzustrebendes Datenmanagementideal. Nicht alle Forschungsdaten sind FAIR verfügbar.
* Der Umgang mit digitalen Forschungsdaten ist oft noch sehr unstrukturiert.
* Universitäten begreifen das digitale Datenmanagement nur sehr langsam als Kernaufgabe.
* Die [\textcolor{linkblue}{NFDI-Initiative}](https://www.nfdi.de/) versucht, das deutsche digitale Forschungsdatenmanagement zu verbessern.
* NFDI ist Projekt-basiert und somit nicht in einem nachhaltigen Rahmen.
* Nicht alle Wissenschaftler:innen möchten ihre Daten systematisch aufbereiten und der Öffentlichkeit zur Verfügung stellen.
* Kulturwandel zu mehr wissenschaftlicher Transparenz und offene öffentlich-finanziert Forschung [Open Research, vgl. z.B. @toelch2018; @miedema2022; @bertram2023] bleibt ein anzustrebenes Ideal.


# Datenformate ====================================== {.plain}
\AtBeginSection{}
\section{Datenformate}
\setstretch{2.5}
\large
\vfill

Daten

FAIR Prinzipien

**Datenformate**

Verzeichnismanagement

Datenimport und Datenexport


# Datenformate
\setstretch{1.4}
\vspace{3mm}

\normalsize
\textcolor{darkblue}{Dateiformate}

\small
* Ein Dateiformat definiert Syntax und Semantik von Daten innerhalb einer Datei.
* Dateiformate sind bijektive Abbildungen von Information auf binären Speicher.
* Allgemein unterscheidet man
  * \small Daten- gegenüber Softwareformaten,
  * textuelle gegenüber binären Dateiformaten, und
  * offene gegenüber propietären (urheberrechtlich geschützten) Dateiformaten.

\normalsize
\textcolor{darkblue}{Binäre Dateiformate}

\small
* Einlesen, Inspektion, und Manipulation ist nur mit spezieller Software möglich.
*  .pdf, .xlsx, .jpg, .mp4 sind binäre Dateiformate.
* Binäre Dateiformate sind oft propietär.
* Binäre Dateiformate wurden früher aufgrund ihrer kleineren Größe bevorzugt eingesetzt.

\normalsize
\textcolor{darkblue}{Textuelle Dateiformate}

\small
* Einlesen, Inspektion, und Manipulation ist mit einfachen allgemeinen Editoren möglich.
* .txt, .csv., .tsv, .json sind textuelle Dateiformate.
* Textuelle Dateiformate sind generell offene Dateiformate.


# Beispiele

\vspace{2mm}
\textcolor{darkblue}{Binäres Dateiformat}

\vspace{1mm}
![](Abbildungen/pds_6_binaeres_dateiformat.pdf){width="60%" fig-align="center"}

\vspace{2mm}
\textcolor{darkblue}{Textuelles Dateiformat}

\vspace{1mm}
![](Abbildungen/pds_6_textuelles_dateiformat.pdf){width="60%" fig-align="center"}


# Textuelle Dateiformate $\vert$ \textcolor{darkblue}{.csv und .tsv}

\setstretch{1.5}

\small
\begin{itemize}
\item CSV = comma-separated values (.csv), TSV = tab-separated values (.tsv)
\item Zentrale Dateiformate zur Speicherung einfacher, tabellarisch strukturierter Daten
\item Repräsentation zeilenweise miteinander verknüpfter Datensätze:
  \begin{itemize}
  \item \small Trennung von Datenfeldern (Spalten) durch Komma (.csv) oder Tab (.tsv)
  \item Trennung von Datensätzen (Zeilen) durch Zeilenumbruch
  \end{itemize}
\item Erste Zeile (Kopfdatensatz/Header) enthält typischerweise die Definition der Spaltennamen
\item Typische Struktur:
  \begin{itemize}
  \item \small Zeilen repräsentieren experimentelle Einheiten (z.B. Versuchspersonen)
  \item Spalten repräsentieren Variablen mit jeweils gemessenen Werten
  \end{itemize}
\end{itemize}


# Textuelle Dateiformate $\vert$ \textcolor{darkblue}{.csv und .tsv}

\setstretch{1.5}

Beispiel

\small
\vspace{3mm}

\begin{minipage}{.1\linewidth}
$\quad$
\end{minipage}

\begin{minipage}{.4\linewidth}
\small
\begin{center}
.csv Dateiinhalt
\end{center}

Einheit, Variable 1, Variable 2

1, 10.1, 67.5

2, 12.9, 51.2

3, 20.4, 70.8

\end{minipage}

\begin{minipage}{.4\linewidth}
\small
\begin{center}
Tabellenrepräsentation
\vspace{1mm}

\begin{tabular}{l|ll}
\hline
Einheit & Variable 1 & Variable 2 \\ \hline
1 & 10.1 & 67.5 \\
2 & 12.9 & 51.2 \\
3 & 20.4 & 70.8 \\ \hline
\end{tabular}
\end{center}
\end{minipage}


# Wide vs. Long Format

\setstretch{1.3}

**\textcolor{darkblue}{Wide Format}**: Alle Variablen einer Einheit in einer Zeile

\small
\begin{center}
\begin{tabular}{l|ll}
\hline
Einheit & Variable 1 & Variable 2 \\ \hline
1 & 10.1 & 67.5 \\
2 & 12.9 & 51.2 \\
3 & 20.4 & 70.8 \\ \hline
\end{tabular}
\end{center}

\normalsize
\vspace{3mm}
**\textcolor{darkblue}{Long Format}**: Variablen einer Einheit über Zeilen verteilt

\small
\begin{center}
\begin{tabular}{l|ll}
\hline
Einheit & Variable  & Messwert \\ \hline
1 & Variable 1 & 10.1 \\
1 & Variable 2 & 67.5 \\
2 & Variable 1 & 12.9 \\
2 & Variable 2 & 51.2 \\
3 & Variable 1 & 20.4 \\
3 & Variable 2 & 70.8 \\ \hline
\end{tabular}
\end{center}

\normalsize
\vspace{3mm}
Das Wide Format ist generell übersichtlicher als das Long Format.


# Textuelle Dateiformate $\vert$ \textcolor{darkblue}{.json}

\setstretch{2}
Übersicht

\small
* JSON = JavaScript Object Notation
* Textuelles Datenformat zum Speichern strukturierter Daten in Key-Value Form.
* Ähnlichkeit mit R-Listen mit benannten Listenelementen.
* Sinnvolles Format für das Speichern von Metadaten.

\normalsize
Elemente von .json Dateien

\small
* *Objekte* enthalten durch Kommata geteilte Listen von *Eigenschaften* in \{ \}
* *Eigenschaften* bestehen aus Key-Value Paaren
* *Key* ist immer ein String mit Hochkommata ""
* *Value* ist ein Objekt, ein Array, ein String, ein Boolean, oder eine Zahl


# .json -- Beispiel
\setstretch{1.2}

\vspace{1mm}
```{latex}
\{

	$\quad\quad$ ``Vorname'' 			: ``Maxi'',

	$\quad\quad$ ``Nachname''			: ``Musterfrau'',

	$\quad\quad$ ``Matrikelnummer''		: 12345,

	$\quad\quad$ ``Fachsemester''		: 2,

	$\quad\quad$ ``Studiengang''		: ``BSc Psychologie'',

	$\quad\quad$ ``Module''	:

	$\quad\quad$ \{

	$\quad\quad\quad\quad$  ``Deskriptive Statistik'' : \{``Abgeschlossen'' : true,  ``Note''  : 1.0 \},

	$\quad\quad\quad\quad$  ``Inferenzstatistik'' : \{``Abgeschlossen'' : false, ``Note'': null \}

	$\quad\quad$ \}

\}
```


# Verzeichnismanagement ====================================== {.plain}
\AtBeginSection{}
\section{Verzeichnismanagement}
\setstretch{2.5}
\large
\vfill

Daten

FAIR Prinzipien

Datenformate

**Verzeichnismanagement**

Datenimport und Datenexport


# Arbeiten mit \textcolor{darkblue}{Strings}

\small
Die Grundeinheit für Text in R sind atomic vectors vom Typ `character`.

Die Elemente von character vectors sind **strings**, nicht einzelne "characters".

Der Begriff "String" in R ist also nur informeller Natur.

\vspace{2mm}
Strings werden mit Anführungszeichen oder Hochkommata erzeugt

\footnotesize
```{r, echo = T, eval = T}
c("Dies ist ein character vector") # Anführungszeichen sind der String Standard
c('Dies ist ein "string"')         # Hochkommata nützlich für Anführungszeichen im String
```

\small
`paste()` konvertiert Vektoren in character und fügt sie elementweise zusammen.

\footnotesize
```{r, echo = T, eval = T}
paste(1, 2)                        # Konvertierung u. Konkatenation einelementiger double vectors
paste("Dies ist", "ein String")    # Konkatenation einelementiger character vectors
```


# Arbeiten mit \textcolor{darkblue}{Strings}

\setstretch{1.3}

\small
`paste()` hat eine Reihe weiterer Funktionalitäten

\vspace{2mm}
\footnotesize
```{r, echo = T, eval = T}
paste(c("Rote", "Gelbe"), "Blume")                   # Vector recylcing, elementweise Veknüpfungen
paste(c("Rote", "Gelbe"), "Blume", 	sep = "-")       # Separatorspezifkation
paste(c("Rote", "Gelbe"), "Blume",  collapse = ", ") # Zusammenfügen mit spezifiziertem  Separator
```

\small
``toString()` ist eine `paste()` Variation für numerische Vektoren

\vspace{2mm}
\footnotesize
```{r, echo = T, eval = T}
toString(1:10)               # Konversion eines double Vektors in formatierten String
toString(1:10, width = 10)   # mit  öglichkeit der Beschränkung auf width Zeichen 
```


# Verzeichnismanagement

\setstretch{1.6}

\textcolor{darkblue}{Datei- und Verzeichnispfade}

\small
\justifying
* Daten sind üblicherweise in Dateien im permanenten Speicher (SSD, HD) abgelegt.
* Um Daten einzulesen, benötigt man ihre Position bzw. Adresse innerhalb der Verzeichnisstruktur des Rechners.
* Die Adressen von Dateien in der Verzeichnisstruktur heißen \textit{Dateipfade}.
* Ein Pfad besteht aus einer durch Schrägstriche getrennten Liste von Verzeichnisnamen.
* Die Art der Schrägstriche hängt vom Betriebssystem ab. \small
  * Windowspfade haben Back-Slashes (\textbackslash)
  * Pfade in Unix-ähnlichen Betriebssystemen (z. B. macOS und Linux) nutzen Forward-Slashes ($/$)
\footnotesize
\vfill

\small
\textcolor{darkcyan}{Beispiele}

\vspace{1mm}
\footnotesize
\setstretch{1}
```{r, echo = T, eval = F}
Windows:
H:\Lehre\Daten                      Pfad, der auf einem Verzeichnisnamen endet
H:\Lehre\Daten\cushny.csv           Pfad, der auf einem Dateinamen endet

Unix-like OS: 
/home/user/Lehre/Daten              Pfad, der auf einem Verzeichnisnamen endet
/home/user/Lehre/Daten/cushny.csv   Pfad, der auf einem Dateinamen endet
```
\vfill


# Verzeichnismanagement

\setstretch{1.5}

\textcolor{darkblue}{working directory}

\small
* Das *Working Directory* kann als der "aktuelle Standort" im lokalen Verzeichnissystem verstanden werden. 
* In VSCode wird der beim Start ausgewählte Ordner automatisch als Working Directory für jede neue R-Terminal-Session verwendet.
* Dies entspricht dem im Explorer sichtbaren übergeordneten Verzeichnis.

`getwd()` gibt das Working Directory an.

\footnotesize
```{r, echo = T, eval = T}
getwd()                                # Get current working directory
```
\vfill


# Verzeichnismanagement

\setstretch{1.5}

\small
\textcolor{darkblue}{Ändern des working directorys}

`setwd()` ändert das Working Directory.

\begin{itemize}
\begin{footnotesize}
\item R verwendet Forward-Slashes ($/$).
\item Bei der \textquote{wörtlichen} Angabe eines Windows-Pfades müssen doppelte Backslashes (\textbackslash\textbackslash) verwendet werden.
\end{footnotesize}
\end{itemize}

\small
Änderung des Working Directory mit Angabe eines absoluten Pfades

\vspace{4mm}
\footnotesize
\setstretch{1.2}
```{r, echo = T, eval = F}
setwd("C:\\Lehre\\Daten")              # Wechsel zu "wörtlich" angegebenem Pfad (Windows-Bsp.)
```

```{r, echo = T, eval = F}
setwd("/home/belindame/Lehre/Daten")   # Wechsel zu "wörtlich" angegebenem Pfad (Unix-Bsp.)
getwd()
```
\vfill


# Verzeichnismanagement

\setstretch{1.7}

\textcolor{darkblue}{Relative vs. absolute Pfade}

\small
\justifying
* \textit{Relative Dateipfade} bezieht sich auf einen Speicherort in Relation zum aktuellen Verzeichnis.
* Bei relativen Dateipfaden bezeichnen . und .. aktuelles und übergeordnetes Verzeichnis.
*  \textit{Absolute Dateipfade} gegeben die Adresse in der Gesamtverzeichnisstruktur der Festplatte an.
* Absolute Dateipfade sind weniger anfällig für Dateiverwechselungen.
* **\textcolor{darkcyan}{Generell wird die Verwendung adaptiv generierter absoluter Pfade empfohlen}.**

\normalsize
\textcolor{darkcyan}{Beispiel}

\footnotesize
\setstretch{1.5}
Wenn das aktuelle Verzeichnis "/home/user/Lehre" lautet, dann beziehen sich folgende Pfade auf *den selben* Ordner:

\vspace{2mm}
```{r, echo = T, eval = F}
/home/user/Lehre/Daten  # Abs. Pfad: Startet in Root-Verzeichnis ("/")
./Daten                 # Rel. Pfad: Startet in aktuellen Arbeitsverzeichnis (/Lehre)
../Lehre/Daten          # Rel. Pfad: Startet in übergeordneten Verzeichnis (/user)
../../user/Lehre/Daten  # Rel. Pfad: Startet zwei Ebenen über akt. Arbeitsverzeichnis (/home)
```
\vfill


# Verzeichnismanagement

\setstretch{1.5}

\small
Änderung des Working Directory mit Angabe eines relatives Pfades

\vspace{4mm}
\footnotesize
\setstretch{1.1}
```{r, echo = T, eval = F}
setwd("/home/belindame/Lehre/Daten")   # Wechsel zu "wörtlich" angegebenem Pfad
getwd()

setwd("..")                            # Wechsel zum übergeordneten Verzeichnis "/Lehre"
getwd()

setwd("..")                            # Wechsel zum übergeordneten Verzeichnis "/belindame"
getwd()

setwd("./Lehre")                       # Wechsel in das Unterverzeichnis "/Lehre"
getwd()

setwd("..")                            # Wechsel zum übergeordneten Verzeichnis "/belindame"
getwd()

setwd("Lehre")                         # Wechsel in das Unterverzeichnis "/Lehre"
getwd()
```
\vfill


# Verzeichnismanagement

\textcolor{darkblue}{Hilfreiche Funktionen für die Definition des Dateipfades}

\small
\setstretch{1.5}
`file.path()` konstruiert Verzeichnis- und Dateipfade Betriebssystem-passend

\footnotesize
\setstretch{1.1}
```{r, echo = T, eval = T}
ein_pfad <- file.path("home", "user", "Lehre", "Daten")  # Konstruiert eine character-Variable
print(ein_pfad)
```
\vspace{2mm}

\small
\setstretch{1.5}
`basename()` gibt die unterste Ebene eines Datei- oder Verzeichnispfades an.

\footnotesize
\setstretch{1.1}
```{r, echo = T, eval = T}
basename(ein_pfad)
```
\vspace{2mm}

\small
\setstretch{1.5}
`dirname()` gibt den Pfad des übergeordneten Verzeichnisses zurück, das die angegebene Datei oder das angegebene Verzeichnis enthält.

\footnotesize
\setstretch{1.1}
```{r, echo = T, eval = T}
dirname(ein_pfad)
```


# Verzeichnismanagement

\textcolor{darkblue}{Hilfreiche Funktionen für die Definition von Dateipfaden}

\small
\vspace{2mm}
\setstretch{1.5}
`gsub()` ersetzt bestimmte Zeichen in einer character-variable.

\footnotesize
\setstretch{1.1}
```{r, echo = T, eval = T}
windows_pfad           <- "C:\\Users\\Username\\Lehre\\Daten"
print(windows_pfad)
daten_pfad             <- gsub("\\\\", "/", windows_pfad)
print(daten_pfad)
```

\small
`sys.frame(1)$ofile` ermittelt den absoluten Pfad des aktuellen Skripts (funktioniert nicht in der Konsole).

\footnotesize
\setstretch{1.1}
```{r, echo = T, eval = F}
skriptpfad             <- sys.frame(1)$ofile        # Pfad des Skripts
skriptordner           <- dirname(skriptpfad)       # Ordner, in dem sich das Skript befindet
print(skriptordner)
```

\footnotesize
\setstretch{1.1}
```{r, echo = F, eval = T}
skriptpfad             <- normalizePath(knitr::current_input())
r_skriptordner         <- dirname(skriptpfad)
print(r_skriptordner)
```
\vfill


# Datenimport und Datenexport ====================================== {.plain}
\AtBeginSection{}
\section{Datenimport und Datenexport}
\setstretch{2.5}
\large
\vfill

Daten

FAIR Prinzipien

Datenformate

Verzeichnismanagement

**Datenimport und Datenexport**


# Datenimport

\setstretch{1.5}

`read.csv()` 

\small
* ist die zentrale Funktion zum Einlesen von CSV Dateien.
* liest eine Datei ein und speichert ihre Inhalte in einem Dataframe.

\tiny
\vspace{2mm}
\setstretch{1.2}
```{r, echo = T, eval = T}
# load data
vl_ordner     <- getwd()                                     # aktuelles Verzeichnis
datenordner   <- file.path(vl_ordner, "Daten")               # Datenverzeichnispfad
dateiname     <- "cushny.csv"                                # (base) filename
dateipfad     <- file.path(datenordner, dateiname)           # filepath
D             <- read.csv(dateipfad)                         # Einlesen der Datei
print(D)
```
\vfill


# Datenimport

\setstretch{1.5}

\small
Im Folgenden werden die einzelnen Schritte der oben verwendeten Dateipfadkonstruktion ausgegeben

\tiny
\vspace{2mm}
\setstretch{1.4}
```{r, echo = T, eval = T}
#| label: show path
vl_ordner     <- getwd()                                     # aktuelles Verzeichnis
print(vl_ordner)
```

\vspace{2mm}
```{r, echo = T, eval = T}
datenordner   <- file.path(vl_ordner, "Daten")               # Datenverzeichnispfad
print(datenordner)
```

\vspace{2mm}
```{r, echo = T, eval = T}
dateiname     <- "cushny.csv"                                # (base) filename
dateipfad     <- file.path(datenordner, dateiname)           # filepath
print(dateipfad)
```
\vfill


# Datenimport

\setstretch{1.5}

\small
`read.csv()` ist ein Wrapper für `read.table()` mit Voreinstellungen `sep = ","` und `header = TRUE`.

\tiny
\vspace{2mm}
\setstretch{1.2}
```{r, echo = T, eval = T}
dateipfad <- file.path(datenordner, "cushny.csv")            # Pfad zur .csv Datei

# Beide Varianten liefern dasselbe Ergebnis
D         <- read.csv(dateipfad)                             # Einlesen der .csv Datei
D         <- read.table(dateipfad, sep = ",", header = TRUE) # Einlesen der .csv Datei
print(D)
```
\vfill


# Datenimport

\setstretch{1.5}

\small
Ein paar weitere Beispiele für Spezifikationen sind

* `sep` für die Auswahl des Separators
* `dec` für die Auswahl des Dezimalzeichens
* `nrow` für die Anzahl der einzulesenden Zeilen
* `skip` für die Anzahl der zu überspringenden Zeilen (inkl. Header)

\tiny
\vfill
```{r, echo = T, eval = T}
D <- read.csv(dateipfad, header = TRUE, sep = ",", nrow = 2)  # Nur 2 Zeilen einlesen
print(D)
D <- read.csv(dateipfad, header = TRUE, sep = ",", skip = 7)  # Ab Zeile 7 einlesen
print(D)
```
\vfill


# Weitere Möglichkeiten des Datenimports

Textdateien (.csv, .tsv, .txt, .json)

\small 
* `read.csv2()`, `read.delim()`, `read.delim2()` als `read.table()` Varianten.
* `readlines` für low-level Textdateiimport.
* `fromJSON()` aus dem Paket `rjson` für .json Dateien.
\vspace{2mm}

\normalsize
Binäre Dateien (.xlsx, .sav, .mat)

\small
* `read.xlsx()` und  `read.xlsx2()` aus dem Paket `xlsx` für Excel .xlsx Dateien.
* `read.spss()` aus dem Paket `foreign` für SPSS .sav Dateien.
* `readMat` aus dem Paket `R.matlab` für Matlab .mat Dateien.
\vspace{2mm}

\normalsize
Für Datenbanken:

\footnotesize
* SQL Datenbanken können mithilfe der Pakete `DBI` und `RSQLite` abgefragt werden.
\vfill


# Import interner R Datensätze

\setstretch{1.4}

\footnotesize
R und R-Pakete beinhalten eine Vielzahl von Beispieldatensätzen.

Die Core R-Datensätze werden aus der R Konsole mit `data()` angezeigt.

Die Datensätze in Paket P werden mit \texttt{data(package = \string"P\string")} angezeigt.

\vspace{2mm}
```{r, echo = T, eval = F}
install.packages("psychTools")    # Installation des Pakets psychTools
data(package = "psychTools")      # Anzeige der psychTools Datensaetze
```

![](Abbildungen/pds_6_r_datasets.pdf)

Alle Datensätze aller installierten Pakete werden mit `data(package = .packages(TRUE))` angezeigt.

Nach Installation und Laden eines Pakets werden Datensätze mit `data()` geladen.

\vspace{2mm}
```{r, echo = T, eval = F}
library(psychTools)    # Laden des Paktes psychTools
data(cushny)           # Laden des cushny Datensatzes aus psychTools
```


# Datenexport

\setstretch{1.5}

`write.table()`

\small
\vspace{-1mm}
* ist die zentrale Funktion zum Speichern von Daten in .csv oder .tsv Dateien.
* erzeugt eine Datei und schreibt Daten eines Dataframes hinein.

\normalsize
Spezifikationen bei der Anwendung

\small
\vspace{-1mm}
* Der Dateipfad wird mit dem Argument `file` angegeben, der Werteseparator mit `sep`.
* Das Argument `row.names = FALSE` unterdrückt das Schreiben von Zeilennahmen.

\tiny
\vspace{1mm}
\setstretch{1.1}
```{r, echo = T, eval = T}
input_dateipfad  <- file.path(datenordner, "cushny.csv")    # Pfad zur Datei, die eingelesen werden soll
output_dateipfad <- file.path(datenordner, "student.csv")   # Pfad der Datei, die geschrieben werden soll

D <- read.table(input_dateipfad, header = TRUE, sep = ",")  # Dateneinlesen
D <- D[,5:6]                                                # Reduktion des Dataframes
write.table(D,                                              # zu speichernder Dataframe
    file = output_dateipfad,                                # Dateinname
    sep = ",",                                              # Werteseparator für .csv
    row.names = F)                                          # keine Zeilennamen
```

\normalsize
\vspace{1mm}
Ergebnisdatei student.csv

\vspace{1mm}
![](Abbildungen/pds_6_writetable.pdf){width="30%"}


# Referenzen

\footnotesize
\setstretch{1.4}
