Daten in R einlesen – darauf muss man achten

0
1005

Was kann ich hier erwarten

Praktikum

RStudio ist in vielen Universitäten immer mehr am kommen. In der Vergangenheit habe ich bereits gezeigt, wie sich der Einstieg mit z. B. swirl ganz einfach gestallten lässt. Doch stellt sich mit dem ersten Datensatz, den man verwenden will, dann doch die Frage: Wie funktioniert das alles nochmal? Vor allem in Bezug auf die Psychologie ist es schwierig, Anleitungen zu finden. Das will ich in meiner kleinen Reihe zum Einstieg in RStudio ändern. Die Themen dafür stehen noch nicht fest und Wünsche können gerne an maximilian.stefani@psystudents.org geschickt werden! Ich werde versuchen, nicht nur für Einsteiger Tipps zu geben, sondern auch für Fortgeschrittene. Gestartet wird nun mit dem Einlesen von Daten aus unterschiedlichen Datensätzen (z. B. SPSS, Excel, Text oder Logfiles).

Mit read.table() geht (fast) alles

Alle, die RStudio installiert haben, haben die Funktion read.table() bereits integriert. Mit ihr kann man eigentlich jeden Datensatz einlesen, es gibt aber Pakete und andere Funktionen, die einem das noch leichter machen. Doch bleiben wir erst einmal bei read.table(). Vorweg, in RStudio unter dem Reiter „Help“ können immer die Beschreibungen der einzelnen Pakete abgerufen werden, dazu in der Suche einfach die Funktion eingeben, so auch für read.table().

In der Beschreibung kann man nachlesen, dass neben read.table() auch die Funktionen read.csv(), read.csv2(), read.delim() und read.delim2() in dem Paket enthalten sind, doch was ist der Unterschied?

help(read.table)

Wie oben erwähnt, gibt es Funktionen, die einem das Leben erleichtern und das sind die gerade genannten. Während wir mit read.table() alle einzelnen Argumente definieren müssen, sind diese (read.csv(), read.csv2(), read.delim() und read.delim2()) schon vordefiniert. Doch welche Bedingungen gibt es und wann verwende ich welche Funktion?

Bedingungen und Unterschiede der read.-Funktionen

Erst einmal ein paar grundlegende Sachen. Um überhaupt Daten importieren zu können müsst ihr read.table() sagen, woher es diese bekommt. Hier gibt es zwei Möglichkeiten. Entweder ihr habt schon ein Arbeitsordner durch ein neues Projekt festgelegt (sehr zu empfehlen!), dann müsst ihr die Daten nur noch in diesen Ordner schieben und keinen Pfad mehr angeben. Gibt es noch keinen Arbeitsordner bzw. einen Pfad dahin, dann könnt ihr diesen ganz einfach setzen:

path <- "C:/Users/.../Daten" #Der Pfad zum Ordner
setwd(path) #Hier wird er festgelegt

Oder ihr sagt der Funktion jedes Mal wieder, wo es den Datensatz herbekommt, das passiert mit „file = „. Wichtig! am Ende muss immer der Dateiname inkl. des Dateityps, z. B. .sav oder .log, in Gänsefüßchen stehen! Bei mir ist heißt die Datei „Proband1.log“.

"daten <- read.table(file = "C:/Users/.../Daten/Proband1.log")

Damit sind wir aber nicht fertig, der Import würde jetzt wahrscheinlich fehlschlagen. Wir müssen noch weitere Argumente definieren, um die Datei erfolgreich importieren zu können. Dazu schauen wir uns einmal den Datensatz genauer an. Damit ihr alles 1:1 nachmachen könnt, könnt ihr hier meinen Beispieldatensatz herunterladen: Datensatz downloaden

1  Scenario - CPT
2  Logfile written - 01/01/2004 09:05:09
3
4  Subject	Trial	Event Type	Code	Time	TTime	Uncertainty	Duration	Uncertainty	ReqTime	ReqDur	Stim Type	Pair Index
5 
6  DK0309	1	Picture	instruction_CPT	166	0	1	21167  	2	0	next	other	0
7  DK0309	1	Response	1	21273	21107	1
8  DK0309	2	Nothing	Start_Trigger	21275	0	1			0		other	0
9  DK0309	3	Picture	black	21333	0	1	9666	3	0	9500	other	0
10 DK0309	4	Picture	CPT4954IP5	31166	0	1	667	2	0	500	other	0
11 DK0309	5	Nothing	999	31834	0	1			0		other	0
12 DK0309	6	Picture	black	31999	0	2	9667	3	0	9500	other	0
13 DK0309	7	Picture	CPT2948IP3	41833	0	1	666	3	0	500	other	0
14 DK0309	8	Nothing	999	42500	0	1			0		other	0
15 DK0309	9	Picture	black	42666	0	1	9667	2	0	9500	other	0
16 DK0309	10	Picture	CPT2978IP4	52499	0	1	667	2	0	500	other	0

Wir können folgende Punkte erkennen:

[list style=“circle“]
[list_item] Die ersten drei Zeilen sind unwichtig und die müssen raus, da R als Header immer die erste Zeile nimmt. [/list_item]
[list_item] Zeile 5 ist leer.[/list_item]
[list_item] Die Trennzeichen zwischen den Spalten sind Leerzeichen. [/list_item]
[list_item] Die Zahlen sind ohne Komma und Punkt (diese müssen wir also theoretisch nicht definieren). [/list_item]
[list_item] Und was ihr jetzt nicht sehen könnt (aber in der Datei): In der Mitte befindet sich wieder der Header (Zeile 491), hier hat das Programm einen Fehler gemacht. Dieser Fehler darf nicht übernommen werden. [/list_item]
[/list]

Ihr seht, es ist einiges zu tun, bis unsere Datei richtig importiert wird. In der Tabelle könnt ihr nun sehen, welche Argumente es gibt. Manche kann man, andere muss man definieren, damit der Import erfolgreich ist.

ArgumentMöglichkeitBeschreibung
file"daten.text"
"daten.log"
"C:/Users/Daten/daten.xls"
Wichtig: Immer die Gänsefüßchen verwenden. Außerdem müssen z.B. bei Windows die Schrägstriche so aussehen --> /
headerTRUE oder T
FLASE oder F
Wenn die erste Zeile die Spaltennamen enthält, dann TRUE.
sep "\t" (für Leerzeichen)
";"
","
Wie sind die Spalten getrennt?
dec","
"."
Wie werden Kommastelllen berichtet? Bei uns eigentlich mit einem Komma.
na.stringsmeist eine Zahl z.B. = 999Sollten NAs definiert sein z.B. 999, dann müsst ihr es hier angeben
nrowsEine Zahl z.B. = 500Behält nur die Zeilen bis zur angegebenen Zahl, hier bis 500
skipEine Zahl z.B. = 3
fillTRUE oder T
FLASE oder F
Fehlende Zellen einer Zeile werden aufgefüllt mit leeren Zellen
blank.lines.skipTRUE oder T
FLASE oder F
Leere Zeilen werden automatisch gelöscht
stringsAsFactorsTRUE oder T
FLASE oder F
Macht aus Wörtern Faktoren
skipNulTRUE oder T
FLASE oder F
Sollen Nullen gelöscht werden?
Tabelle1. Argumente für das Einlesen von Daten mit read.table()

Jetzt können wir unsere Funktion schreiben:

daten = read.table("Proband1-CPT.log", 
                   header = TRUE, 
                   skip = 3,
                   sep = "\t", 
                   dec = ",", 
                   fill = TRUE, 
                   blank.lines.skip = TRUE, 
                   nrows = 488) # Alles bis Zeile 488 einlesen

Es geht auch schneller

Mit den Funktionen read.csv(), read.csv2(), read.delim() und read.delim2() könnt ihr euch viel Arbeit sparen! Dort sind die meisten Argumente schon vordefiniert und ihr müsst nur noch Sonderfälle angeben.

read.csv(file, header = TRUE, sep = ",", dec = ".", fill = TRUE, ...)
read.csv2(file, header = TRUE, sep = ";", dec = ".", fill = TRUE, ...)
read.delim(file, header = TRUE, sep = "\t", dec = ".", fill = TRUE, ...)
read.delim2(file, header = TRUE, sep = "\t", dec = ";", fill = TRUE, ...)
Tabelle 2. Unterschiede von read.csv(), read.csv2(), read.delim() und read.delim2()

Wie ihr sehen könnt, brauchen wir nur read.delim2() zu verwenden. Diese Funktion ist für Daten mit Leerzeichen und Kommazahlen, die mit einem Komma getrennt sind. Unser Code verkürzt sich dann:

daten = read.delim2("Proband1-CPT.log", 
                    skip = 3,
                    nrows = 488) # Alles bis Zeile 488 einlesen

Der Unterschied zwischen read.csv() und  read.delim() eienrseits und read.csv2() und  read.delim2() andererseits ist im Prinzip ganz einfach. Die 2er-Varianten sind für uns Europäer, da wir unsere Zahlen mit einem Komma und nicht mit einem Punkt trennen und zwischen den Werten meist einen Semikolon und nicht nur ein Komma haben.

Wie wir Excel-Daten (.xls oder . xlsx) schnell einlesen, erfahrt ihr im nächsten Artikel.