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, dass der weiten Verbreitung, Nützlichkeit und Transparenz von Forschungsdaten im Digitalzeitalterrechnung 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 sich dabei etwa um Zahlenarrays oder Characterarrays, aber auch 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 der 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-Schleifenenkodierung 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 Universtätsssystem begreift das digitale Datenmanagement nur sehr langsam als eine Kernaufgabe. Im größeren, wenn auch Projekt-basiertem, und damit nicht nachhaltigem Rahmen, versucht die Initiative zur Nationalen Forschungsdateninfrastruktur (NFDI), das deutsche digitale Forschungsdatenmanagement zu. 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-finanziert Forschung (Open Research, vgl. z.B. Toelch & Ostwald (2018), Miedema (2022), Bertram et al. (2023)) bleibt ein anzustrebenes Ideal.

17.2 Dateiformate

Allgemeine definiert Dateiformat 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 propietä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 propietär. Früher wuden 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 udn ihre Manipulation mit einfachen allgemeinen Editoren, wie beispielsweise VSCode problemlos möglich und die Dateiformate sind generell nicht propietä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 und .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 (tab-separated values) Dateien 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 Zeilen einer .csv oder .tsv Datei enthält typischerweise die Definition der Spaltennamen und wird als Kopfdatensatz (Header) bezeichnet. Ein typisches Beispiel einer .csv 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 modell-basierter 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 recylcing, elementweise Veknuepfungen
paste(c("Rote", "Gelbe"), "Blume")  
[1] "Rote Blume"  "Gelbe Blume"
# Separatorspezifkation
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 Arbeitspeicher zu laden, benötig man ihre Addresse in der Verzeichnisstruktur des Computers. Abbildung 17.3 zeigt einen Ausschnitt der Verzeichnisstruktur eines typischen Windows-Rechners.

Abbildung 17.3: Windows Verzeichnisstruktur

Die Addressen 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. Bei 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 Addresse 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 übergeordnetes 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 Windowspfaden benötigt deshalb doppelte backward slashes \\

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

Mithilfe der file.path() Funktion können Betriebssystem-konforme 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 spezialisierte 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