Übungsaufgabe: Batch-Verarbeitung

Übung Forschungsmethodik II | SS 2024

Autor
TU Chemnitz

C. Maiwald

Professur Forschungsmethoden und Analyseverfahren in der Biomechanik

Datum

11. April 2024

Ausgangssituation

In der heutigen Einheit geht es darum, ein Skript zu entwickeln, welches eine batch-Verarbeitung (“Stapelverarbeitung”) mehrerer Dateien vornimmt, um die darin enthaltenen Daten am Ende einer Analyse zugänglich zu machen.

In zahlreichen Forschungskontexten wird man vor der Datenanalyse einen sehr zerstreuten Datenbestand vorfinden, in welchem für jede Versuchsperson separat erzeugte Dateien mit darin enthaltenen Mess- oder Befragungsdaten vorhanden sind. Der Optimalfall, dass man sich im Rahmen einer wissenschaftlichen Studie direkt einen aufbereiteten Datensatz erzeugen kann, wird womöglich nur bei digitalen Umfragen/Fragebögen auf Befragungsservern möglich sein. In den allermeisten Fällen werden die erhobenen Daten in verstreuten Tabellen (z. B. Excel- oder Textdateien) abgelegt sein.

Um diese Datenbestände einer Analyse zuführen zu können, müssen wir zunächst alle Daten aus allen individuellen Dateien “einsammeln” und sie in einem geeigneten data.frame anordnen. Dabei werden wir heute auch das rekursive Durchsuchen von Unterordnern einbeziehen, denn die Dateien liegen oftmals über mehrere Unterordner verstreut vor.

Vorbereitung

Lade die Datei Verzeichnisstruktur.zip aus OPAL und entpacke sie in einem geeigneten Verzeichnis. Setze das Arbeitsverzeichnis von R in diesen Ordner.

Dort sollte dann folgende Ordnerstruktur zu sehen sein:

Ordnerstruktur
Tipp

In jedem der Probandenordner P01 bis P04 befinden sich zwei Unterordner (Fragebogen, Kraft), in welchen sich jeweils eine Excel-Datei (.xlsx) befindet, welche Daten zur jeweiligen Versuchsperson und Erhebungsmethode enthält. Ziel dieser Übungsaufgabe ist es, ein Skript zu entwickeln, welches den gesamten Verzeichnisbaum rekursiv durchläuft und die Daten aus allen .xlsx-Dateien in zwei data.frames sammelt: FB für die Fragebogendaten, Kraft für die Kraftwerte.

Aufgabe 1

Sieh dir die Inhalte der .xlsx-Dateien an und führe dann folgende Schritte durch:

  • Erzeuge zwei leere data.frames FB und Kraft mit passenden Variablenanordnungen, welche am Ende die Daten aller Probanden des Verzeichnisbaums aufnehmen werden.

  • Schreibe den Einlesebefehl, so dass die Variablen aus den .xlsx-Dateien in die eben generierten leeren data.frames FB und Kraft eingelesen werden. Eine mögliche Funktion dafür ist readxl::read_excel().

FB <- data.frame(Name = character(), Vorname = character(), Alter = numeric(),
                 Item1 = numeric(), Item2 = numeric(), Item3 = numeric(), Item4 = numeric(),
                 VAS = numeric())
KRAFT <- data.frame(Name = character(), Vorname = character(), Alter = numeric(),
                    Versuch1 = numeric(), Versuch2 = numeric(), Versuch3 = numeric())
library(readxl)
fb <- read_excel("P02/Fragebogen/fb.xlsx", sheet=1)
kraft <- read_excel("P02/Kraft/kraft.xlsx", sheet=1)

Aufgabe 2

Generiere eine Einleseroutine für alle Dateien innerhalb des Verzeichnisbaums. Die wichtigste Funktion dafür ist list.files(). Sie listet die Dateien auf, die innerhalb eines Verzeichnisses liegen. Filter können nach Dateityp gesetzt werden. Rekursives Durchsuchen gelingt mit der Option recursive=TRUE.

### Variante 1: zwei getrennte Dateilisten
FB.Dateien <- list.files(pattern = "fb.xlsx", recursive = TRUE)
Kraft.Dateien <- list.files(pattern = "kraft.xlsx", recursive = TRUE)

for(i in 1:length(FB.Dateien)){
  fb <- read_excel(FB.Dateien[i], sheet=1)
  kraft <- read_excel(Kraft.Dateien[i], sheet=1)
  FB <- rbind(FB, fb)
  KRAFT <- rbind(KRAFT, kraft)
}
### Für Fortgeschrittene: Variante 2 mit einer Liste und logischer Prüfung
Dateien <- list.files(pattern = ".xlsx", recursive = TRUE)
FB.check <- grepl("Fragebogen", Dateien)

for(i in 1:length(Dateien)){
  D <- read_excel(Dateien[i], sheet=1)
  
  if(FB.check[i]==TRUE ){
    FB <- rbind(FB, D)
  }else{
    KRAFT <- rbind(KRAFT, D)
  }
}

Aufgabe 3

Speichere die so erzeugten data.frames in einer .RData-Datei im Arbeitsverzeichnis.

save(list = c("FB", "KRAFT"), file="Daten_Einlesen.RData")