[1] "Dies ist ein character vector"
[1] "Dies ist ein \"string\""
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.
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)).
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)
Accessibility (Zugänglichkeit)
Interoperability (Interoperabilität)
Reusability (Wiederverwendbarkeit)
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.
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.
.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.
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 |
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 |
.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.
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:
[1] "Dies ist ein character vector"
[1] "Dies ist ein \"string\""
Die Funktion paste()
konvertiert Vektoren in character und fügt sie elementweise zusammen.
[1] "1 2"
[1] "Dies ist ein String"
Die Funktion paste()
hat darüber hinaus eine Reihe weiterer Funktionalitäten, die manchmal hilfreich sein können:
[1] "Rote Blume" "Gelbe Blume"
[1] "Rote-Blume" "Gelbe-Blume"
[1] "Rote Blume, Gelbe Blume"
Die Funktion toString()
ist eine paste()
Variante für numerische Vektoren:
[1] "1, 2, 3, 4, 5, 6, 7, 8, 9, 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.
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.
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.
R besitzt ein sogenanntes working directory aus dem per Default Dateien gelesen werden. Bei geöffnetem R Terminal gibt getwd()
das working directory an.
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 \\
Mithilfe der file.path()
Funktion können Betriebssystem-konforme Verzeichnis und Dateipfade erzeugt werden:
Die Funktion dirname()
gibt das Verzeichnis an, das ein Verzeichnis oder eine Datei enthält:
[1] "C:/Users/dirko/Nextcloud/Home/pdwp-online/dirk-ostwald.github.io/_part_2"
[1] "C:/Users/dirko/Nextcloud/Home/pdwp-online/dirk-ostwald.github.io"
Die Funktion basename()
gibt die unterste Ebene eines Datei- oder Verzeichnispfades an:
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:
DBI
und RSQLite
abgefragt werden.