17  Datenmanagement

In diesem Abschnitt wollen wir einige allgemeine Begrifflichkeiten zum Umgang mit Forschungsdaten einführen, gängige Formate zur längerfristigen Speicherung von Daten diskutieren und uns schließlich mit dem praktischen Einlesen und Speichern von Daten im Rahmen des R Verzeichnismanagements beschäftigen.

17.1 Das FAIR Datenideal

Das FAIR Datenideal ist ein Prinzip zum Management von Forschungsdaten, das der weiten Verbreitung, Nützlichkeit und Transparenz von Forschungsdaten im Digitalzeitalter Rechnung trägt. Unter Forschungsdaten werden dabei im Allgemeinen “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.” (Rat für Informationsinfrastrukturen (2017)) verstanden. Konkret handelt es sich dabei etwa um Zahlenarrays oder Characterarrays, aber auch um Computersoftware wie R-Skripte, digitale Werkzeuge, Workflows und Analysepipelines.

Neben diesen, manchmal auch als Primärdaten bezeichneten Datenformen sind für das FAIR Datenideal sogenannte Metadaten von Bedeutung. Dabei handelt es sich um Daten, die Informationen über andere Daten repräsentieren. Man unterscheidet dabei beispielsweise deskriptive, strukturelle und administrative Metadaten (Riley (2017), Ulrich et al. (2022)).

  • Deskriptive Metadaten dienen dem Auffinden und der Identifikation einer Datenquelle. Beispiele für deskriptive Metadaten sind etwa Titel einer wissenschaftlichen Publikation oder ihr Digital Object Identifier (DOI, Rosenblatt (1997)). DOIs sind alphanumerische Kennungen, die digitale Objekte eindeutig identifizieren und als persistente Links zu Objekten im Internet funktionieren.
  • 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-Schleifen-Enkodierung dreidimensionaler Datenobjekte.
  • Administrative Metadaten schließlich sind Daten, die das Management einer Datenquelle erleichtern. Beispiele für administrative Metadaten sind Provenienz, das Dateiformat, die Zugangsrechte oder andere technische Informationen zu einer Datenquelle.

Das FAIR-Ideal zum Forschungsdatenmanagement hat seinen Ursprung in Diskussionen im Rahmen der FORCE11-Konferenzserie und wurde 2016 durch Wilkinson et al. (2016) akademisch kommuniziert. Es 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:

Findability (Auffindbarkeit)

  • 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)

  • 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)

  • 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)

  • 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.

Der Anspruch an ein faires Forschungsdatenmanagement ist mittlerweile recht verbreitet, wobei die FAIR-Prinzipien mit mehr oder weniger bürokratischem Aufwand umgesetzt werden können. Es bleibt aber festzuhalten, dass zurzeit die FAIR-Prinzipien im Wesentlichen ein anzustrebendes Datenmanagementideal sind, und längst nicht alle Forschungsdaten FAIR verfügbar sind. Tatsächlich ist der Umgang mit digitalen Forschungsdaten auch weiterhin noch sehr unstrukturiert und gerade das deutsche Universitätssystem begreift das digitale Datenmanagement nur sehr langsam als eine Kernaufgabe. In größerem, wenn auch projektbasiertem und damit nicht nachhaltigem Rahmen versucht die Initiative zur Nationalen Forschungsdateninfrastruktur (NFDI), das deutsche digitale Forschungsdatenmanagement zu verbessern. Leider bleibt weiterhin festzuhalten, dass viele durch öffentliche Mittel finanzierte Wissenschaftler:innen von ihnen erhobene Forschungsdaten weder systematisch aufbereiten noch der Öffentlichkeit zur Verfügung stellen wollen. Hier ist also weiterhin auf einen Kulturwandel zu mehr wissenschaftlicher Transparenz zu hoffen und offene, öffentlich finanzierte Forschung (Open Research, vgl. z.B. Toelch & Ostwald (2018), Miedema (2022), Bertram et al. (2023)) bleibt ein anzustrebendes Ideal.

17.2 Dateiformate

Allgemein definieren Dateiformate Syntax und Semantik von Daten innerhalb einer Datei. Dateiformate sind dabei bijektive Abbildungen von Information auf den binären Langzeitspeicher. Allgemein unterscheidet man Datendateiformate gegenüber Softwaredateiformaten, textuelle gegenüber binären Dateiformaten und offene gegenüber proprietären, d.h. urheberrechtlich geschützten, Dateiformaten. Bei binären Datendateiformaten ist das Einlesen von Daten, ihre Inspektion, und ihre Manipulation generell nur mit spezieller Software möglich. Beispiele für binäre Dateiformate sind .docx, .pdf, .xlsx, .jpg und .mp4 Dateien. Binäre Dateiformate sind dabei oft proprietär. Früher wurden binäre Dateiformate aufgrund ihres geringeren Speicherbedarfs auch für Forschungsdaten bevorzugt eingesetzt. Heutzutage werden dagegen textuelle Datendateiformate wie .txt, .csv, .tsv und .json favorisiert. Bei diesen Formaten ist das Einlesen der gespeicherten Daten, ihre Inspektion und ihre Manipulation mit einfachen allgemeinen Editoren wie beispielsweise VS Code problemlos möglich und die Dateiformate sind generell nicht proprietär. Abbildung 17.1 zeigt die Darstellung eines binären Datenformats und eines textuellen Datenformats im Windows Editor. Generell bieten sich im Forschungskontext und im Sinne der FAIR-Prinzipien also offene, textuelle Datendateiformate an. Exemplarisch wollen wir hier als textuelle Dateiformate das .csv-, das .tsv- sowie das .json-Dateiformat genauer betrachten.

Abbildung 17.1: Binäre und textuelle Dateiformate in Editordarstellung.

17.2.1 .csv- und .tsv-Dateien

.csv- (comma-separated values) und .tsv-Dateien (tab-separated values) sind wichtige Dateiformate zur Speicherung einfacher, tabellarisch strukturierter Daten. Allgemein repräsentieren .csv und .tsv zeilenweise miteinander verknüpfte Datensätze. Dabei werden Datenfelder innerhalb einer Zeile durch Kommata (.csv) oder Tabulatorzeichen (.tsv) und einzelne Datensätze durch Zeilenumbrüche voneinander abgegrenzt. Der Datensatz in der ersten Zeile einer .csv- oder .tsv-Datei enthält typischerweise die Definition der Spaltennamen und wird als Kopfdatensatz (Header) bezeichnet. Ein typisches Beispiel einer .csv-Datei ist in Abbildung 17.1 (rechts) dargestellt. Dabei repräsentieren die Zeilen experimentelle Einheiten (hier Versuchspersonen) und die Spalten verschiedene Variablen, für die jeweils ein Wert bei der Versuchsperson bestimmt wurde.

Im Kontext der Datenanalyse unterscheidet man bei .csv- und .tsv-Dateien eine Wide-Format- und eine Long-Format-Datenrepräsentation. Bei der Wide-Format- Datenrepräsentation werden alle Variablen einer experimentellen Einheit wie in obigem Beispiel in einer Zeile repräsentiert, vgl. Tabelle 17.1. Allerdings ist es für manche Datenanalysen hilfreicher, die Daten einer experimentellen Einheit über Zeilen zu verteilen. Dies führt auf das sogenannte Long Format, wie in Tabelle 17.2 gezeigt. Generell ist das Wide Format für ein erstes intuitives Verständnis eines Datensatzes oft hilfreicher, wohingegen das Long Format Daten im Rahmen modellbasierter Analysen meist konsistenter mit der Modellarchitektur repräsentiert.

Tabelle 17.1: Wide Format (EE: Experimentelle Einheit, V1,V2,V3: Variablen)
EE V1 V2 V3
1 10.1 67.5 4
2 12.9 51.2 2
3 20.4 70.8 5
4 17.5 60.3 7
Tabelle 17.2: Long Format (EE: Experimentelle Einheit, V1,V2,V3: Variablen)
Einheit Variable Messwert
1 V1 10.1
1 V2 67.5
1 V3 4
2 V1 12.9
2 V2 51.2
2 V3 2
3 V1 20.4
3 V2 70.8
3 V3 5
4 V1 17.5
4 V2 60.3
4 V3 7

17.2.2 .json Dateien

.json (JavaScript Object Notation) ist ein textuelles Datenformat, das zum Speichern strukturierter Daten in Key-Value-Form verwendet wird. Es weist Ähnlichkeiten mit R-Listen auf, insbesondere mit benannten Listenelementen, und eignet sich daher gut als Format für die Speicherung von Metadaten.

Eine .json-Datei besteht aus Objekten, die in geschweiften Klammern { } notiert werden und eine durch Kommata getrennte Liste von Eigenschaften enthalten. Jede Eigenschaft ist ein Key-Value-Paar, wobei der Key immer als String in Hochkommata (” “) geschrieben wird. Der Value kann wiederum ein Objekt, ein Array, ein String, ein Boolean oder eine Zahl sein. Abbildung Abbildung 17.2 zeigt den Inhalt einer .json-Datei zur Speicherung von Studierendeninformationen.

Abbildung 17.2: .json Dateiformat.

17.3 Verzeichnismanagement

Da Verzeichnissysteme von Computern üblicherweise in Worten (z. B. C:\Users) statt numerisch dargestellt sind, ist eine Grundlage für das automatisierte Einlesen von langfristig gespeicherten Daten in den Arbeitsspeicher und umgekehrt des Speicherns von Daten aus dem Arbeitsspeicher im langfristigen Speicher das Arbeiten mit sogenannten Strings (Zeichenketten). Strings werden in R mit Anführungszeichen oder Hochkommata erzeugt:

# Anfuehrungszeichen sind  der String Standard
c("Dies ist ein character vector")
[1] "Dies ist ein character vector"
# Hochkommata koennen bei Anfuehrungszeichen im String helfen
c('Dies ist ein "string"')
[1] "Dies ist ein \"string\""

Die Funktion paste() konvertiert Vektoren in character und fügt sie elementweise zusammen.

# Konvertierung und Konkatenation einelementiger double vectors
paste(1,2)
[1] "1 2"
# Konkatenation einelementiger character strings
paste("Dies ist", "ein String")
[1] "Dies ist ein String"

Die Funktion paste() hat darüber hinaus eine Reihe weiterer Funktionalitäten, die manchmal hilfreich sein können:

# Vector recycling, elementweise Verknuepfungen
paste(c("Rote", "Gelbe"), "Blume")
[1] "Rote Blume"  "Gelbe Blume"
# Separatorspezifikation
paste(c("Rote", "Gelbe"), "Blume",  sep = "-")
[1] "Rote-Blume"  "Gelbe-Blume"
# Zusammenfuegen mit spezifiziertem  Separator
paste(c("Rote", "Gelbe"), "Blume",  collapse = ", ")
[1] "Rote Blume, Gelbe Blume"

Die Funktion toString() ist eine paste() Variante für numerische Vektoren:

# Konversion eines double Vektors in formatierten String
toString(1:10)
[1] "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
# mit  Moeglichkeit der Beschraenkung auf width Zeichen
toString(1:10, width = 10)
[1] "1, 2, ...."

Um nun die Daten einer Datei im Langzeitspeicher in den Arbeitsspeicher zu laden, benötigt man ihre Adresse in der Verzeichnisstruktur des Computers. Abbildung 17.3 zeigt einen Ausschnitt der Verzeichnisstruktur eines typischen Windows-Rechners.

Abbildung 17.3: Windows Verzeichnisstruktur

Die Adressen von Dateien in der Verzeichnisstruktur heißen Dateipfade (paths). Ein Pfad besteht aus einer durch Schrägstriche getrennten Liste von Verzeichnisnamen. Dabei werden unter Windows traditionell linksgeneigte Schrägstriche (\, backslash) und unter Mac und Linux rechtsgeneigte Schrägstriche (/, slash) genutzt. Unter Windows findet sich zusätzlich in der Regel an oberster Stelle der Verzeichnisstruktur der Festplattenname (z.B. C:\ oder D:\), unter Mac der Benutzername (/Users/) und Linux das Heimverzeichnis (/home/). Die folgenden Beispiele sind Windows-basiert.

# Pfad der auf einem Verzeichnisnamen endet
C:\Users\dirko\Nextcloud\Home\pdwp-online\dirk-ostwald.github.io\_data

# Pfad der auf einem Dateinamen endet
C:\Users\dirko\Nextcloud\Home\pdwp-online\dirk-ostwald.github.io\_data\cushny.csv

Absolute Dateipfade geben die Adresse eines Verzeichnisses oder einer Datei in der Gesamtverzeichnisstruktur der Festplatte und sind wenig anfällig für Dateiverwechselungen. Relative Dateipfade beziehen sich dagegen auf einen Speicherort in Relation zum aktuellen Verzeichnis, wobei . und .. das aktuelle und das übergeordnete Verzeichnis bezeichnen. Bei relativen Dateipfaden kann es durchaus zu Dateiverwechselungen kommen. Generell wird also die Verwendung adaptiv generierter absoluter Pfade empfohlen.

# Dateiname in absoluter Pfadform
fname =  "D:\Lehre\Daten\cushny.csv"

R besitzt ein sogenanntes working directory, aus dem per Default Dateien gelesen werden. Bei geöffnetem R-Terminal gibt getwd() das working directory an.

getwd()
[1] "C:/Users/dirko/Nextcloud/Home/pdwp-online/dirk-ostwald.github.io/_part_2"

setwd() ändert das working directory. Dabei ist zu beachten, dass R nur mit forward slashes / arbeitet. Die manuelle Spezifikation von Windows-Pfaden benötigt deshalb doppelte backward slashes \\

setwd("C:\\Users\\dirko\\Nextcloud\\Home\\pdwp-online\\dirk-ostwald.github.io\\_data")
getwd()

Mithilfe der Funktion file.path() können betriebssystemkonforme Verzeichnis- und Dateipfade erzeugt werden:

file.path("D:", "Nextcloud", "Home", "Teaching")

Die Funktion dirname() gibt das Verzeichnis an, das ein Verzeichnis oder eine Datei enthält:

getwd()
[1] "C:/Users/dirko/Nextcloud/Home/pdwp-online/dirk-ostwald.github.io/_part_2"
dirname(getwd())
[1] "C:/Users/dirko/Nextcloud/Home/pdwp-online/dirk-ostwald.github.io"

Die Funktion basename() gibt die unterste Ebene eines Datei- oder Verzeichnispfades an:

getwd()
[1] "C:/Users/dirko/Nextcloud/Home/pdwp-online/dirk-ostwald.github.io/_part_2"
basename(getwd())
[1] "_part_2"

17.4 Datenimport und Datenexport

Zum Einlesen von einfach strukturierten .csv-Dateien bietet sich die R-Funktion read.csv() an. Diese Funktion liest eine Datei ein und speichert ihre Inhalte in einem Dataframe.

D = read.csv("C:\\Users\\dirko\\Nextcloud\\Home\\pdwp-online\\dirk-ostwald.github.io\\_part_2\\_data\\cushny.csv")
print(D)
   Control drug1 drug2L drug2R delta1 delta2L delta2R
1      0.6   1.3    2.5    2.1    0.7     1.9     1.5
2      3.3   1.4    3.8    4.4    1.6     0.8     1.4
3      4.7   4.5    5.8    4.7    0.2     1.1     0.0
4      5.5   4.3    5.6    4.8    1.2     0.1     0.7
5      6.2   6.1    6.1    6.7    0.1     0.1     0.5
6      3.2   6.6    7.6    8.3    3.4     4.4     5.1
7      2.5   6.2    8.0    8.2    3.7     5.5     5.7
8      2.8   3.6    4.4    4.3    0.8     1.6     1.5
9      1.1   1.1    5.7    5.8    0.0     4.6     4.7
10     2.9   4.9    6.3    6.4    2.0     3.4     3.5

Folgender R-Code definiert den absoluten Pfad der Datei adaptiv in der Verzeichnisstruktur des Computers mithilfe des R working directories.

wdir    = getwd()                           # Working directory
print(wdir)                                 # Ausgabe
ddir    = file.path(wdir, "_part_2/_data")  # Datenverzeichnispfad
print(ddir)                                 # Ausgabe
fname   = "cushny.csv"                      # (base) filename
print(fname)                                # Ausgabe
fpath   = file.path(ddir, fname)            # filepath
print(fpath)                                # Ausgabe
D       = read.csv(fpath)                   # Einlesen der Datei
print(D)                                    # Ausgabe des Dataframes

Darüber hinaus bietet R eine Vielzahl von Möglichkeiten des Datenimports mithilfe spezialisierter Funktionen:

Für .csv und andere Textdateien:

  • read.csv(), 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.

Für binäre Dateien:

  • 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.

Für Datenbanken:

  • SQL-Datenbanken können mithilfe der Pakete DBI und RSQLite abgefragt werden.
Bertram, M. G., Sundin, J., Roche, D. G., Sánchez-Tójar, A., Thoré, E. S. J., & Brodin, T. (2023). Open Science. Current Biology, 33(15), R792–R797. https://doi.org/10.1016/j.cub.2023.05.036
Miedema, F. (2022). Open Science: The Very Idea. Springer Netherlands. https://doi.org/10.1007/978-94-024-2115-6
Rat für Informationsinfrastrukturen. (2017). Datenschutz Und Foschungsdaten - Aktuelle Empfehlungen.
Riley, J. (2017). Understanding Metadata: What Is Metadata, and What Is It For. National Information Standards Organization.
Rosenblatt, B. (1997). The Digital Object Identifier: Solving the Dilemma of Copyright Protection Online. Journal of Electronic Publishing, 3(2). https://doi.org/10.3998/3336451.0003.204
Toelch, U., & Ostwald, D. (2018). Digital Open Science—Teaching Digital Tools for Reproducible and Transparent Research. PLOS Biology, 16(7), e2006022. https://doi.org/10.1371/journal.pbio.2006022
Ulrich, H., Kock-Schoppenhauer, A.-K., Deppenwiese, N., Gött, R., Kern, J., Lablans, M., Majeed, R. W., Stöhr, M. R., Stausberg, J., Varghese, J., Dugas, M., & Ingenerf, J. (2022). Understanding the Nature of Metadata: Systematic Review. Journal of Medical Internet Research, 24(1), e25440. https://doi.org/10.2196/25440
Wilkinson, M. D., Dumontier, M., Aalbersberg, Ij. J., Appleton, G., Axton, M., Baak, A., Blomberg, N., Boiten, J.-W., da Silva Santos, L. B., Bourne, P. E., Bouwman, J., Brookes, A. J., Clark, T., Crosas, M., Dillo, I., Dumon, O., Edmunds, S., Evelo, C. T., Finkers, R., … Mons, B. (2016). The FAIR Guiding Principles for Scientific Data Management and Stewardship. Scientific Data, 3(1), 160018. https://doi.org/10.1038/sdata.2016.18