3  Pakete und Daten laden

3.1 Verwendete Packages

Man kann alle Packages zu Anfang laden, oder jeweils dann, wenn man sie im Skript braucht. Der Vorteil von “Anfang” ist, dass man sofort oben im Skript sieht, welche Packages ein Skript verwendet. Der Vorteil von “wenn man es braucht” ist, dass man im Code besser erkennt, welche Funktionen zu welchem Package gehören. In der Praxis findet man beides.

3.1.1 Pakete für Datenverarbeitung und Statistik

  1. Das vorliegende Dokument verwendet tidyverse, welches sehr viele sehr nützliche Funktionen für Datenauswertung bereithält.

  2. rio ist ein Paket, das hilft, Datensätze aus anderen Formaten (z.B. Excel oder SPSS) einzulesen oder in solchen Formaten zu speichern.

library( tidyverse )
library( rio )

3.1.2 Pakete für RMarkdown

Zusätzlich verwenden wir noch zwei Pakete, zur Verschönerung von Tabellen.

library( knitr )
library( kableExtra )

3.2 Daten einlesen

Als nächstes wollen wir die Daten in R einlesen, so dass sie im Workspace sind und man mit ihnen arbeiten kann.

3.2.1 Verzeichnisse und Pfade

R erwartet Dateien immer in einem bestimmten Ordner. Das ist der Pfad (oder das Verzeichnis) von dem aus R “denkt”.

Man kann unterscheiden zwischen absoluten Pfaden und relativen Pfaden.

Absolute Pfade Relative Pfade

Fängt mit einer Laufwerksbezeichnung an (auf Windows)

z.B. “C:/Programming/Statistics Tutorial RTL/Daten/Datensatz1.csv”

Ein relativer Pfad ist ein Pfad, der relativ formuliert ist zu dem Ort, an dem R gerade “ist” bzw. von wo aus R gerade “denkt”.

Nehmen wir mal an, der Arbeitspfad (working directory) von R wäre bei Ihnen gerade auf das Verzeichnis “C:/Programming/Statistics Tutorial RTL/” gesetzt, dann wäre der Pfad zu dem Datensatz von oben relativ dazu ausgedrückt “Daten/Datensatz1.csv”.

Nachteil, dass sie dann nicht mehr stimmen, wenn sich irgendwo im Pfad etwas ändert

z.B. durch Umbenennen eines Überordners oder wenn man die Analyse auf einen anderen Rechner überträgt.

Vorteil, dass sie weiterhin stimmen, selbst wenn Sie den Ordner verschieben oder umbenennen, so lange der relative Ort bestehen bleibt (also der Ordern “Daten” mit Inhalt) auch mitverschoben wird.

Man muss allerdings sicherstellen, R zu Beginn der Session das gewünschte working directory - also das Ausgangsverzeichnis - mitzuteilen (s.u.).

Ein weiterer Vorteil von der Nutzung des working directory und relativen Pfaden ist, dass Plots und Daten standardmäßig von R dort gespeichert werden. Es befindet sich dann alles an einem Ort.

Wir werden in diesem Dokument immer mit relativen Pfaden arbeiten.

3.2.2 Verzeichnisse ermitteln und setzen

3.2.2.1 Verzeichnis ermitteln

Sie können einfach herausfinden, welches working directory R gerade verwendet, indem Sie folgenden Befehl verwenden:

getwd()
[1] "/Users/b1082752/Documents/02_teaching/RTL_Books/GitLabRepos/rtl_RTut"

RStudio hat eine sehr praktische Methode eingebaut, um herauszufinden, an welchem Ort sich das Skript oder Rmarkdown-Dokument befindet, in dem Sie aktuell arbeiten. Das kann sehr praktisch sein, da man oft das Arbeitsverzeichnis da hin setzen will, wo das Skript auch ist, um dann zum Beispiel von dort mit relativen Pfaden zu arbeiten.

Dieser Befehl liest den Pfad des aktuellen Dokuments und schreibt ihn in die Variable “dataPath”:

dataPath <-  rstudioapi::getActiveDocumentContext()$path
print(dataPath)
[1] "/Users/b1082752/Documents/02_teaching/RTL_Books/GitLabRepos/rtl_RTut"

3.2.2.2 Verzeichnis setzen

Das Pendant zu “getwd()” heißt “setwd()” und ändert das working directory.

Sie können damit den Pfad “dataPath”, der oben ermittelt und als Variable gespeichert wurde, als working directory einstellen.

setwd(dataPath)

Sie können das working directory auch anders setzen, bspw. so:

dataPath <- "C:/Programming & Stats stuff/Statistics Tutorial RTL/"
setwd(dataPath)

oder Sie lassen den Umweg über die Variable “dataPath” weg:

setwd("C:/Programming & Stats stuff/Statistics Tutorial RTL/")

Damit die Pfade bei Ihnen funktionieren, müssen Sie bitte das working directory immer auf den Ordner setzen, in dem Sie bei sich das Skript und die Daten abgespeichert haben.

Bei Pfaden gehen die Striche je nach Betriebssystem in die andere Richtung:

Mac und Linux verwenden ein /, Windows aber ein \ als Verzeichnistrenner.

3.3 Daten laden

Zeitplanung: nach den ersten 1-2 Erhebungen

Die vermutlich häufigsten Datenformate
.csv Textdateien, in denen jede Spalte eine Variable, und jede Zeile einen Trial enthält
.xlsx Exceldateien mit demselben Format
.RData bereits in R erstellte oder bearbeitete Daten, die im R-Format gespeichert wurden
.sav SPSS-Dateien, in denen repeated measures nicht über Codiervariablen, sondern über 1 Spalte je Bedingung gespeichert sind

Für alle 4 Fälle wird hier Code zur Verfügung gestellt.

3.3.1 Daten, die als Textdatei vorliegen

Viele Daten sind im comma separated values (csv) Format gespeichert. Hier ist zu beachten, dass diese Dateien verschiedene Trennzeichen haben können.

  • Das Trennzeichen gibt an, wo ein neuer Eintrag bzw. eine neue Zelle beginnt. Häufig ist das Trennzeichen der Tabulator (Tab), das Komma und der Strichpunkt/Semikolon.

  • Man muss das Trennzeichen in der Einlese-Funktion mit dem Flag “sep” anpassen.

  • Im Beispiel ist die Textdatei durch Tabs getrennt, welches man mit der Buchstabenkombi “ angibt.

Wenn R beim Laden einer txt oder csv Datei scheinbar nur Müll einliest, liegt das häufig einfach am falsch angegebenen Trennzeichen. Öffnen Sie die Daten mit einem Texteditor und schauen Sie nach, was zwischen den Einträgen für ein Zeichen steht - das ist das Trennzeichen.

#daten laden
bsp <- read.csv("RTL_beispieldaten.txt", sep = "\t")

Um die Datenverarbeitung und -analyse zu erleichtern, laden wir zuerst das dplyr-Paket, das effiziente Funktionen für die Manipulation von Dataframes bietet, einschließlich Filtern, Sortieren und Zusammenfassen von Daten, was für unsere Analyse unerlässlich ist.

library( dplyr )

Die Daten sehen in etwa so aus (Ausschnitt)

bsp %>% select(Participant, Stimuli, Condition, 
               Repetition, SOA, Response.correct, Real_Release_RT) %>% 
  slice(1:10) %>% 
  kable(caption = 'Ausschnitt der Beispieldaten', booktabs = TRUE)
Ausschnitt der Beispieldaten
Participant Stimuli Condition Repetition SOA Response.correct Real_Release_RT
B006b-08 6_1 uncrossed 1 800 TRUE 618
B006b-08 5_2 uncrossed 1 100 TRUE 824
B006b-08 6_2 uncrossed 1 50 TRUE 752
B006b-08 6_1 uncrossed 1 300 TRUE 646
B006b-08 2_5 crossed 1 800 TRUE 869
B006b-08 1_6 crossed 1 50 TRUE 936
B006b-08 1_3 crossed 1 50 TRUE 544
B006b-08 1_5 uncrossed 1 300 TRUE 1029
B006b-08 4_1 uncrossed 1 100 TRUE 779
B006b-08 2_5 uncrossed 1 800 TRUE 504

3.3.2 Langes vs. weites (long vs. wide) Format

Long Format Wide Format

…eine Datenspeicherung, bei der es für eine abhängige Variable (z.B: RT) nur eine einzige Spalte im Datensatz gibt.

  • Das heißt, die Ergebnisse aller Bedingungen werden alle unter derselben Spalte eingetragen. Damit man im Datensatz sieht, zu welcher Bedingung ein eingetragener Wert gehört, gibt es Faktoren- oder Codierspalten.

  • Hat das Design z.B. einen Faktor A mit drei Faktorstufen A1, A2 und A3, dann gibt es neben der Spalte RT noch eine Spalte “Faktor A”, deren Einträge in jeder Zeile die Bedingung angeben (also A1 bis A3).

… speichert Bedingungen in eigenen Spalten.

  • Für den o.g. Faktor A gäbe es also 3 Ergebnisspalten. In Spalte 1 werden alle RTs gelistet, die in Bedingung A1 gemessen wurden, in Spalte 2 Werte aus A2 etc. Entsprechend benötigt man dann keine Faktor-/Codiervariable, denn der Faktor ergibt sich aus den Spalten im Datensatz.
Vorteil: je Bedingung können beliebig viele Zeilen (also Fälle/Trials) vorhanden sein , ohne dass leere Zellen entstehen, denn jeder Wert erhält eine eigene Zeile.

Nachteile: wenn in den Faktorstufen unterschiedlich viele Fälle (Trials) vorhanden sind, entstehen leere Zellen

  • die Faktoren sind aus dem Datensatz nicht direkt ersichtlich, v.a. dann nicht, wenn es keine Spaltennamen im Datensatz gibt
  • hat man mehrere Faktoren, benötigt man eigene Spalten für jede Faktorenkombination. Hat man bspw. neben Faktor A noch Faktor B mit Stufen B1 und B2, benötigt man Spalten für A1+B1; A1+B2; A2+B1; etc.

Mit mehreren Faktoren und mehreren Faktorstufen werden Dateien dann sehr unübersichtlich. Dieses Problem potenziert sich, wenn man mehrere abhängige Variablen im Datensatz hat.

R verwendet standardmäßig das lange Format. SPSS verwendet standardmäßig das weite Format.

3.3.3 Daten, die in Excel vorliegen

bsp <- import("RTL_beispieldaten.xlsx", which = 1)

Dieser Befehl kommt aus dem Paket rio und kann für Exceltabellen auch noch andere Parameter annehmen. Bspw. kann man bei Exceldateien mit mehreren Blättern das zweite Blatt mit “which = 2” einlesen.

3.3.4 Daten, die in SPSS vorliegen

Das Paket rio kann auch verwendet werden, um SPSS-Daten einzulesen.

bsp_RTs<- import("RTL_beispieldaten_RTs.sav")

3.3.5 Daten, die schon in R gespeichert waren

R erlaubt, unter einem Dateinamen mehrere Variablen und dataframes zu speichern. Daher kann es passieren, dass der Load-Befehl mehrere Sachen gleichzeitig lädt. Also erstmal anschauen. Dazu den Workspace leeren (in RStudio oben rechts bei Reiter “Environment” den kleinen Besen klicken - das löscht alle vorhandenen Daten).

Anschließend den load-Befehl ausführen. Das, was dann im “Global Environment” gezeigt wird, sind die Daten, die man geladen hat.

load("RTL_beispieldaten.RData")

3.4 Daten speichern

Sobald Daten in R importiert wurden, sollten sie im R-Format abgespeichert werden, da dann das Laden am einfachsten ist und alle bearbeiteten Variablen ihre Eigenschaften (z.B. Variablentyp) behalten. Dies gilt insbesondere dann, wenn man die Daten aus einem anderen Format (txt, SPSS) nach R holt.

Wenn Sie an den Daten etwas verändert haben, passen Sie auf, dass Sie nicht ihre ursprünglichen Daten aus Versehen überschreiben. Das können Sie verhindern, indem Sie dem Datensatz einen neuen Namen geben. In unserem Beispiel hängen wir “_export” hinten an den Dateinamen dran.

Eine alternative Möglichkeit ist, den Einlesebefehl und alle darauf folgenden Umformungen als Skript zu speichern und bei jedem Durchlaufen die Originaldatei zu laden. Dies hat den Vorteil, dass stets dokumentiert ist, welche Veränderungen die Daten durchlaufen haben. Wir nutzen für BSc/MSc/ES-Arbeiten Variante 1 (Daten in R-Format speichern), da wir dann untereinander die Daten einfacher teilen können.

3.4.1 Speichern im R-typischen Format (als RData)

# Daten für weitere Verwendung in R speichern, zB um Sie seine*r Betreuer*in zu schicken
save (bsp, file = "RTL_beispieldaten_export.RData")

3.4.2 Speichern als Textdatei

write.table(bsp, file = "RTL_beispieldaten_export.txt", sep = "\t",
            row.names = FALSE, col.names = TRUE)
  • “sep” ist das Trennzeichen zwischen Spalten, \t ist das Tab-zeichen.

  • “col.names” exportiert auch die Variablennamen als erste Spalte

3.4.3 Speichern als als Excel-Datei

Hierzu kann der “export”-Befehl aus dem Paket rio verwendet werden.

export(bsp, file = "RTL_beispieldaten_export.xlsx")

3.4.4 Speichern als SPSS-Datei

Auch das SPSS-Format kann mit “export” wie bei den Excel-Dateien gespecihert werden. Bei SPSS ist das weite Format üblich. Da es schnell unübersichtlich wird, werden hier nur die Reaktionszeiten (RTs) berücksichtigt. Die verwendeten Befehle zum Erstellen des Daten-Ausschnitts (filter etc.) werden unten noch genauer erklärt und müssen hier nicht im Detail nachvollzogen werden.

# Reaktionszeiten über die VP und Reize aggregieren (mitteln)
bsp_RTs <- bsp %>% filter(Repetition==1) %>% dplyr::select(Participant, Stimuli, SOA, Real_Release_RT) %>% group_by(Participant, Stimuli, SOA) %>% summarise(RT=round(mean(as.numeric(Real_Release_RT), na.rm = TRUE), digits = 2), .groups = "drop") %>% ungroup()


# den Auschnitt in eine "weites" Format (SPSS-typisch) umwandeln...
bsp_RTs_wide <-  bsp_RTs %>% unite(Stim_SOA, c(Stimuli, SOA)) %>% pivot_wider(names_from = Stim_SOA, values_from = RT)

Die Daten im weiten Format sehen dann so aus (Ausschnitt)

#Datensatz betrachten: Jede VP ist jetzt in einer Zeile (=weites Format, s.u.)
bsp_RTs_wide %>% select(1:10) %>% 
  slice(1:10) %>% 
  kable(caption = 'Ausschnitt der Beispieldaten im weiten Format') %>% 
  scroll_box(width = "100%")
Ausschnitt der Beispieldaten im weiten Format
Participant 1_3_50 1_3_100 1_3_300 1_3_800 1_4_50 1_4_100 1_4_300 1_4_800 1_5_50
B006b-08 743.00 747.92 733.92 632.71 924.33 716.83 647.58 578.71 872.04
B006b-09 802.79 720.42 567.62 572.75 686.54 668.83 613.62 567.92 797.50
B006b-10 1117.22 976.00 887.75 928.29 1122.54 1087.75 923.58 864.96 1107.52
B006b-11 1144.91 1020.50 1101.33 892.58 1096.71 960.54 965.83 936.04 1112.96
B006b-12 934.12 786.08 617.50 693.38 836.12 803.46 779.08 725.23 925.09
B006b-13 672.25 683.50 599.79 668.17 950.77 813.79 719.17 601.46 617.67
B006b-14 1318.33 1354.79 1271.75 1063.04 1112.21 1114.29 915.42 877.22 1571.54
B006b-15 676.41 690.81 858.58 866.30 835.46 763.48 807.00 840.59 663.43
B006b-16 1011.29 922.17 935.17 812.08 1099.46 1065.29 985.88 933.71 1023.21
B006b-17 852.88 701.50 741.35 601.09 870.79 805.88 721.65 692.96 687.25

Bevor wir als SPSS-Datei speichern, müssen wir die Variablen auch noch ein bisschen umbenenen, weil SPSS es nicht mag, wenn Variablennamen mit einer Zahl beginnen. Da es alles RTs sind, hängen wir “RT” vorne an die Namen dran.

VarsOldName <- grep("[[:digit:]]", names(bsp_RTs_wide), value = TRUE)
VarsNewName <- paste("RT", VarsOldName, sep="_")

bsp_RTs_wide <- bsp_RTs_wide %>% rename_with(~ VarsNewName, all_of(VarsOldName))
export(bsp_RTs_wide, "RTL_beispieldaten_export_RTs.sav") #exportiert als SPSS-Datei