library( tidyverse )
library( rio )
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
Das vorliegende Dokument verwendet tidyverse, welches sehr viele sehr nützliche Funktionen für Datenauswertung bereithält.
rio ist ein Paket, das hilft, Datensätze aus anderen Formaten (z.B. Excel oder SPSS) einzulesen oder in solchen Formaten zu speichern.
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”:
<- rstudioapi::getActiveDocumentContext()$path dataPath
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:
<- "C:/Programming & Stats stuff/Statistics Tutorial RTL/"
dataPath 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
.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
<- read.csv("RTL_beispieldaten.txt", sep = "\t") bsp
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)
%>% select(Participant, Stimuli, Condition,
bsp %>%
Repetition, SOA, Response.correct, Real_Release_RT) slice(1:10) %>%
kable(caption = 'Ausschnitt der Beispieldaten', booktabs = TRUE)
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.
|
… speichert Bedingungen in eigenen Spalten.
|
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
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
<- import("RTL_beispieldaten.xlsx", which = 1) bsp
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.
<- import("RTL_beispieldaten_RTs.sav") bsp_RTs
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 %>% 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()
bsp_RTs
# den Auschnitt in eine "weites" Format (SPSS-typisch) umwandeln...
<- bsp_RTs %>% unite(Stim_SOA, c(Stimuli, SOA)) %>% pivot_wider(names_from = Stim_SOA, values_from = RT) bsp_RTs_wide
Die Daten im weiten Format sehen dann so aus (Ausschnitt)
#Datensatz betrachten: Jede VP ist jetzt in einer Zeile (=weites Format, s.u.)
%>% select(1:10) %>%
bsp_RTs_wide slice(1:10) %>%
kable(caption = 'Ausschnitt der Beispieldaten im weiten Format') %>%
scroll_box(width = "100%")
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.
<- grep("[[:digit:]]", names(bsp_RTs_wide), value = TRUE)
VarsOldName <- paste("RT", VarsOldName, sep="_")
VarsNewName
<- bsp_RTs_wide %>% rename_with(~ VarsNewName, all_of(VarsOldName)) bsp_RTs_wide
export(bsp_RTs_wide, "RTL_beispieldaten_export_RTs.sav") #exportiert als SPSS-Datei