Kapitel 2 Daten importieren und exportieren Empirische Daten liegen typischerweise in Form von Datensätzen vor, die aus mehreren einzelnen Variablen bestehen. Diese Variablen können etwa Stufen eines Gruppierungsfaktors, Zeichenketten oder numerische Werte beinhalten, wobei alle Variablen Daten derselben Beobachtungsobjekte speichern. Während Abschn. 4.1 den Umgang mit Datensätzen eingehend vorstellt, sollen bereits in diesem Kapitel verschiedene Wege vorgestellt werden, auf denen die für eine statistische Analyse notwendigen Daten in R verfügbar gemacht werden können. Dabei empfiehlt es sich, nie mit den Originaldaten selbst zu arbeiten. Stattdessen sollten Kopien eines Referenz-Datensatzes verwendet werden, um diesen gegen unbeabsichtigte Veränderungen zu schützen. Es ist zwar möglich, Werte für einzelne Variablen auf der Konsole einzugeben und zu Datensätzen zusammenzufügen, in der Praxis kommt dies jedoch selten vor. Stattdessen werden Datensätze meist aus Online-Quellen oder aus Dateien eingelesen, die mit anderen Programmen erstellt wurden. Dateneingabe sowie der Datenaustausch mit anderen Programmen werden vertieft im Manual R Data Import/Export (R Development Core Team, 2013c) sowie von Spector (2008) behandelt. 2.1 Daten im Textformat lesen und schreiben Für den Import in R sollten Daten in einfachen Textdateien so organisiert sein, dass sich die Variablen in den Spalten und die Werte jeweils eines Beobachtungsobjekts in den Zeilen befinden. Für alle Variablen sollten gleich viele Beobachtungen vorliegen, so dass sich insgesamt eine rechteckige Datenmatrix ergibt. Bei fehlenden Werten ist es am günstigsten, sie konsistent mit einem expliziten Code zu kennzeichnen, der selbst kein möglicher Wert ist. Weiter ist darauf zu achten, dass Variablennamen den R-Konventionen entsprechen und beispielsweise kein #, %, ' oder Leerzeichen enthalten (vgl. Abschn. 1.3.1). Mit read.table() werden in Textform vorliegende Daten geladen und als Datensatz ausgegeben, für wichtige Argumente vgl. Tab. 2.1. RStudio stellt im Workspace-Tab mit Import Dataset eine grafische Oberfläche für read.table() bereit. Argument Tabelle 2.1: Wichtige Argumente von read.table() Bedeutung 20 D. Wollschläger, R kompakt, DOI 10.1007/978-3-642-40311-8_2, Springer-Verlag Berlin Heidelberg 2013
file header sep dec na.strings stringsasfactors Tabelle 2.1: (Forts.) (ggf. Pfad und) Name der einzulesenden Quelle bzw. des zu schreibenden Ziels (meist eine Datei), in Anführungszeichen gesetzt 1 Wenn in der einzulesenden Quelle in der ersten Zeile Spaltennamen vorhanden sind, muss header=true gesetzt werden (Voreinstellung ist FALSE) Trennzeichen zwischen zwei Spalten in file. Voreinstellung ist jeglicher zusammenhängender Whitespace (Leerzeichen oder Tabulatoren), unabhängig davon, wie viele davon aufeinander folgen. Andere häufig verwendete Werte sind das Komma (",") oder das Tabulatorzeichen ("\t") 2 Das in der Datei verwendete Dezimaltrennzeichen, Voreinstellung ist der Punkt "." Vektor mit den zur Codierung fehlender Werte verwendeten Zeichenketten. Voreinstellung ist "NA" Variablen mit Zeichenketten als Werten werden automatisch in Gruppierungsfaktoren konvertiert (Voreinstellung TRUE). Sollen solche Variablen als character Vektoren gespeichert werden, ist das Argument auf FALSE zu setzen (vgl. Abschn. 4.1.1) Für das Argument file können nicht nur lokal gespeicherte Dateien angegeben werden: Die Funktion liest mit file="clipboard" auch Werte aus der Zwischenablage, 3 die aus einem anderen Programm etwa mit Strg+c dorthin kopiert wurden. Online verfügbare Dateien können mit file=url(" URL ") direkt von einem Webserver geladen werden. Anders als in Webbrowsern muss dabei der Protokollteil der Adresse (http:// oder ftp://) explizit genannt werden, also z. B. file=url("http://www.server.de/datei.txt"). Zum Speichern von Objekten in Textdateien dient write.table(). > write.table(x= Objekt, file=" Dateiname ", sep=" ", dec=".", + row.names=true, col.names=true, quote=true) Die Funktion akzeptiert als Argumente u. a. file, sep und dec mit derselben Bedeutung wie bei read.table(). Statt in eine Datei kann write.table() mit file="clipboard" eine begrenzte Menge von Daten auch in die Zwischenablage schreiben (vgl. Fußnote 3), woraufhin sie in 1 Werden die einzulesenden Daten von R nicht gefunden, ist zunächst mit dir() zu prüfen, ob das von R durchsuchte Verzeichnis (ohne explizite Angabe eines Pfades ist es das mit getwd() angezeigte Arbeitsverzeichnis) auch jenes ist, das die Datei enthält. 2 Sobald für das Argument sep ein selbst gewählter Wert wie "\t" vergeben wird, ändert sich die Bedeutung dieses Zeichens: Tauchen in der Datei dann etwa zwei Tabulatoren hintereinander auf, interpretiert R dies als eine leere Zelle der Datenmatrix, also als fehlenden Wert. Ebenso gelten zwei nur durch ein Leerzeichen getrennte Werte nicht mehr als zwei Zellen, sondern als eine. 3 Unter MacOS ist file=pipe("pbpaste") zu verwenden. 21
anderen Programmen mit Strg+v eingefügt werden können. Über die Argumente row.names und col.names wird festgelegt, ob Zeilen- und Spaltennamen mit in die Datei geschrieben werden sollen (Voreinstellung für beide ist TRUE). Zeichenketten werden in der Ausgabe in Anführungszeichen gesetzt, sofern nicht das Argument quote=false gesetzt wird. Wenn z. B. der mit data.frame() erstellte Datensatz mydf (vgl. Abschn. 4.1) im aktuellen Arbeitsverzeichnis in Textform abgespeichert und später wieder eingelesen werden soll, so lauten die Befehle: > mydf <- data.frame(iv=factor(rep(c("a", "B"), 5)), DV=rnorm(10)) > write.table(mydf, file="data.txt") # Datensatz speichern > mydf <- read.table("data.txt", header=true) # Datensatz einlesen > str(mydf) # Information zu Variablen im Datensatz mydf 'data.frame': 10 obs. of 2 variables: $ IV: Factor w/ 2 levels "A","B": 1 2 1 2 1 2 1 2 1 2 $ DV: num 0.425-1.224-0.572-0.738-1.753... > head(mydf, n=4) # die ersten 4 Zeilen von mydf IV DV 1 A -1.7875911 2 B 1.2069604 3 A -1.3862725 4 B 0.6903706 2.2 R-Objekte speichern und laden Eine andere Möglichkeit zur Verwaltung von Objekten in externen Dateien bieten die Funktionen save( Daten, file=" Dateiname ") zum Speichern und load(file=" Dateiname ") zum Öffnen. Unter Daten können dabei verschiedene Objekte durch Komma getrennt angegeben werden. Alternativ lässt sich das Argument list verwenden, das einen Vektor mit den Namen der zu speichernden Objekte akzeptiert. So würde list=ls() alle sichtbaren Objekte des Workspace übergeben. Die Daten werden in einem R-spezifischen, aber plattformunabhängigen Format gespeichert, bei dem Namen und Klassen der gespeicherten Objekte erhalten bleiben. Deshalb ist es nicht notwendig, das Ergebnis von load() einem Objekt zuzuweisen; die gespeicherten Objekte werden unter ihrem Namen wiederhergestellt. > save(mydf, file="data.rdata") # speichere mydf im Arbeitsverzeichnis > load("data.rdata") # lese mydf wieder ein Ähnlich wie save() Objekte in einem binären Format speichert, schreibt dump(" Objekt ", file=" Dateiname ") die Inhalte von Objekten in eine Textdatei, die sich auch durch gewöhnliche Texteditoren bearbeiten lässt. Auf diese Weise erzeugte Dateien lassen sich mit source(" Dateiname ") einlesen. > dump("mydf", file="dumpmydf.txt") # Datensatz speichern > source("dumpmydf.txt") # Datensatz einlesen 22
2.3 Daten im Editor bearbeiten Kapitel 2 Daten importieren und exportieren Bereits im Workspace vorhandene Datensätze oder einzelne Variablen können unter Windows und MacOS über den in R integrierten Dateneditor geändert werden. Er wird mit fix( Objekt ) aufgerufen und ähnelt dem Arbeitsblatt eines Programms zur Tabellenkalkulation. Innerhalb des Editors können Zellen mit der Maus ausgewählt und dann durch entsprechende Tastatureingaben mit Werten gefüllt werden eine leere Zelle steht dabei für einen fehlenden Wert. Ebenso lassen sich durch einen Klick auf die Spaltenköpfe Name und Datentyp der Variablen neu festlegen. Während der Editor geöffnet ist, bleibt die Konsole für Eingaben blockiert. Vorgenommene Änderungen werden automatisch im Datensatz gespeichert, sobald der Editor geschlossen wird. > fix(mydf) 2.4 Daten mit anderen Programmen austauschen Wenn Daten mit anderen Programmen ausgetauscht werden sollen etwa weil die Daten nicht in R eingegeben wurden, so ist der Datentransfer oft in Form von reinen Textdateien möglich. Diese Methode ist auch recht sicher, da sich die Daten jederzeit mit einem Texteditor inspizieren lassen und der korrekte Transfer in allen Stufen kontrolliert werden kann. In diesem Fall kommen in R meist read.table() und write.table() zum Einsatz. Beim Im- und Export von Daten in Dateiformaten kommerzieller Programme besteht dagegen oft die Schwierigkeit, dass die Formate nicht öffentlich dokumentiert und auch versionsabhängigen Änderungen unterworfen sind. Beim Austausch von Daten über proprietäre Formate sollten daher bevorzugt einfach strukturierte Datensätze verwendet werden. 2.4.1 Programme zur Tabellenkalkulation Programme zur Tabellenkalkulation (etwa Microsoft Excel oder OpenOffice Calc) sind für die Dateneingabe komfortabler zu benutzen und bieten mehr Funktionen als der in R mitgelieferte Dateneditor. Der Transfer von Daten zwischen Excel oder Calc und R ist am einfachsten, wenn die Daten aus der Tabellenkalkulation in eine Textdatei exportiert werden, wobei als Spalten-Trennzeichen der Tabulator verwendet wird. Dezimaltrennzeichen ist in Programmen zur Tabellenkalkulation für Deutschland meist das Komma. Um eine mit diesen Einstellungen exportierte Datei mit Spaltennamen in der ersten Zeile in R zu laden, wäre ein geeigneter Aufruf von read.table(): > mydf <- read.table(file=" Dateiname ", header=true, sep="\t", dec=",") Excel und Calc verwenden in der Voreinstellung den Tabulator als Spaltentrennzeichen, ein Austausch kleinerer Datenmengen ohne Umweg über eine externe Datei ist also auch wie folgt möglich: Zunächst wird in der Tabellenkalkulation der gewünschte Datenbereich inkl. der Variablennamen in der ersten Zeile markiert und mit Strg+c in die Zwischenablage kopiert. In R unter Windows können die Daten dann so eingelesen werden: 23
> mydf <- read.table(file="clipboard", header=true, sep="\t", dec=",") Um einen Datensatz aus R heraus wieder einem anderen Programm verfügbar zu machen, wird er in demselben Format gespeichert entweder in einer Datei oder bei kleinen Datensätzen in der Zwischenablage. Im anderen Programm können die Daten aus der Zwischenablage dann mit Strg+v eingefügt werden. > write.table(x= Datensatz, file="clipboard", sep="\t", dec=",", + row.names=false) Für Excel stellt RExcel ein Add-In zur Verfügung, das dafür sorgt, dass R-Funktionen direkt aus Excel heraus benutzbar sind (Heiberger & Neuwirth, 2009; Neuwirth, 2013). Zudem ermöglicht es einen Datenaustausch ohne den Umweg eines Exports ins Textformat, indem es in R Funktionen zum Lesen und Schreiben von Dateiname.xlsx Dateien bereitstellt. Um Excel-Dateien in R zu verwenden, eignet sich auch das Paket XLConnect (Mirai Solutions GmbH, 2013). Generell empfiehlt es sich, aus Excel zu importierende Daten dort so anzuordnen, dass sie in der ersten Zeile und Spalte des ersten Tabellenblattes beginnen, wobei die Spaltennamen in der ersten Zeile stehen. Excel-Tabellen lassen sich auch als ODBC-Datenbanken lesen, vgl. Abschn. 2.4.3. 2.4.2 SPSS, Stata und SAS SPSS verfügt mit den Essentials for R über eine nachträglich installierbare Erweiterung, mit der R-Befehle direkt in SPSS ausgewertet werden können. Auf diese Weise lassen sich dort nicht nur in R verwaltete Datensätze nutzen, sondern auch ganze Auswertungsschritte bis hin zur Erstellung von Diagrammen in R-Syntax durchführen. Genauso erlaubt es die Erweiterung, mit SPSS erstellte Datensätze im R-Format zu exportieren. Einige der im folgenden erwähnten Einschränkungen, die andere Methoden des Datenaustauschs mit sich bringen, existieren für die genannte Erweiterung nicht, was sie zur bevorzugten Methode der gemeinsamen Verwendung von SPSS und R macht. 4 SPSS-Datensätze können in R mit Funktionen gelesen und geschrieben werden, die das Paket foreign (R Core Members, DebRoy, Bivand et al., 2013) bereitstellt. So liest read.spss() Dateiname.sav Dateien. 5 > read.spss(file=" Dateiname ", use.value.labels=true, to.data.frame=false, + trim.factor.names=false) Variablen, deren Werte in SPSS vollständig mit Labels versehen sind, konvertiert read.spss() in Faktoren, sofern nicht use.value.labels=false gesetzt wird. In der Voreinstellung ist das Ergebnis ein Objekt der Klasse list, was durch das Argument to.data.frame=true geändert werden kann. Mit trim.factor.names=true wird erreicht, dass Bezeichnungen von Faktorstufen auf ihre tatsächliche Länge gekürzt werden andernfalls können sie ungewollt 256 Zeichen umfassen. Wurden in SPSS auch Labels für die Variablen vergeben, tauchen diese nach 4 Für einen detaillierten Vergleich der Arbeit mit R, SAS und SPSS vgl. Muenchen (2011), der auch den Datenaustausch zwischen diesen Programmen behandelt. 5 Die Funktion spss.get() aus dem Paket Hmisc (Harrell Jr, 2013) verwendet read.spss() mit geeigneteren Voreinstellungen und verbessert den Import von Datumsangaben und Variablen-Labels. 24
dem Import als Vektor im Attribut variable.labels des erstellten Objekts auf und können etwa über attr( Objekt, "variable.labels") gelesen und verändert werden. Sollen in R bearbeitete Datensätze SPSS verfügbar gemacht werden, ist write.foreign() aus dem Paket foreign zu benutzen. > write.foreign(df= Datensatz, datafile=" Dateiname ", + codefile=" Dateiname ", package="spss") Hierbei ist unter datafile der Name der Textdatei anzugeben, in der sich die eigentlichen Daten befinden sollen. Der für codefile einzutragende Name bezeichnet die SPSS Syntax-Datei mit der Endung sps mit jenen Befehlen, die in SPSS zum Einlesen dieser Daten dienen. Der erste von R in diese Datei geschriebene Befehl bezeichnet dabei den Namen der Daten-Datei häufig empfiehlt es sich, ihm im Syntax-Editor von SPSS den vollständigen Dateipfad voranzustellen, damit SPSS die Datei in jedem Fall findet. Zudem kann SPSS Textdateien einlesen, wie sie mit write.table(..., row.names=false, sep="\t", dec=",") erstellt werden. Beim Import von Daten in SPSS ist darauf zu achten, dass die Variablen letztlich das richtige Format (numerisch oder Text) sowie den richtigen Skalentyp (nominal, ordinal oder metrisch) erhalten. Weiterhin orientiert sich SPSS in seiner Wahl des Dezimaltrennzeichens nicht an den Windows-Ländereinstellungen, sondern an einer internen Ländereinstellung (sog. LOCALE). Nach Möglichkeit sollten Daten also bereits mit jenem Dezimaltrennzeichen exportiert werden, das SPSS erwartet. Wo dies nicht möglich ist, lässt sich die Ländereinstellung in SPSS vor dem Import mit dem Befehl SET LOCALE='German'. so umschalten, dass ein Komma als Dezimaltrennzeichen gilt und mit SET LOCALE='English'. so, dass dies der Punkt ist. Sollten Umlaute beim Import Probleme bereiten, können sie bereits in R mit Befehlen wie Variable <- gsub("ä", "ae", Variable ) ersetzt werden (vgl. Abschn. 3.10.4). Neben dem Datenaustausch mit SPSS gibt es auch die Möglichkeit, Daten mit Stata zu teilen, wofür ebenfalls Funktionen aus dem foreign Paket dienen (für Details vgl. Muenchen & Hilbe, 2010): read.dta() liest Dateiname.dta Dateien, write.foreign(..., package="stata") schreibt sie. Der Austausch mit SAS geschieht mit Dateien im XPORT-Format analog über read.xport() und write.foreign(..., package="sas"). 2.4.3 Datenbanken In R lassen sich Daten aus Datenbanken vieler verschiedener Formate direkt lesen. 6 Dabei muss zunächst eine Verbindung zur Datenbank hergestellt werden, woraufhin sich SQL-Kommandos wie fetch und query in der üblichen Syntax anwenden lassen. Dies bietet sich besonders bei extrem großen Datensätzen an, die zuviel Arbeitsspeicher belegen würden, wenn man sie als Ganzes in R öffnen wollte (vgl. Abschn. 11.2.5). Geeignete Funktionen für Datenbanken im ODBC-Format (dies schließt Excel-Dateien mit ein 7 ) werden vom Paket RODBC bereitgestellt (Ripley, 2012). Auch für MySQL, Oracle, SQLite Datenbanken und die Java Datenbankschnittstelle existieren ähnliche Pakete auf CRAN. 6 Für eine detaillierte Beschreibung der Arbeit mit Datenbanken vgl. J. Adler (2009) und Spector (2008). 7 Diese Möglichkeit setzt voraus, dass ein ODBC-Treiber unter Windows installiert ist. 25
Im Beispiel soll eine Datenbankverbindung zur Excel-Datei data.xls geöffnet werden, die u. a. das Tabellenblatt sheet1 enthält. In diesem Tabellenblatt befinden sich drei Spalten mit jeweils einem Variablennamen in der ersten und Daten von vier Beobachtungen in den folgenden Zeilen. # Datenbankverbindung im Schreib-Lese-Modus öffnen > library(rodbc) # für odbc Befehl (), sql Befehl () > xlscon <- odbcconnectexcel2007("data.xls", readonly=false) > odbcgetinfo(xlscon) # Verbindungsinformationen... > sqltables(xlscon) # Tabellenblätter auflisten (Spalte TABLE_NAME) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 Pfad xls Datei \\data <NA> sheet1$ SYSTEM TABLE <NA> 2 Pfad xls Datei \\data <NA> sheet2$ SYSTEM TABLE <NA> > (mydfxls <- sqlfetch(xlscon, "sheet1")) # sheet1 in R speichern VpNr IV DV 1 1 A 4 2 2 A 6 3 3 B 7 4 4 B 8 # Fälle nach verbundenen Kriterien für IV und DV auswählen > sqlquery(xlscon, "select * from [sheet1$] where IV = 'A' AND DV < 10") VpNr IV DV 1 1 A 4 2 2 A 6 > mydfxls$newdv <- rnorm(nrow(mydfxls)) # Variable hinzufügen > sqlsave(xlscon, mydfxls, tablename="newsheet") # in Excel speichern > odbcclose(xlscon) # Datenbankverbindung schließen 26
http://www.springer.com/978-3-642-40310-1