GNU R: Datenimport und -export
Der Datenaustausch zwischen verschiedenen Anwendungen ist oft eine mühsame Angelegenheit mit vielen Fallstricken. Er erfordert daher einiges an Aufmerksamkeit und Sorgfalt. R kann zahlreiche Formate einlesen. Welches Format im Einzelfall am geeignetsten ist, muss oft ausprobiert werden, besonders wenn das native Format eines Programmes nicht unterstützt wird. So wird z.B. das Dateiformat der Statistiksoftware Statistica von R nicht unterstützt. Allerdings bietet Statistica die Möglichkeit, die Daten unter anderem als SPSS-Datei oder als CSV-Datei (via Text File) zu exportieren, die von R eingelesen werden können.
Import
[Bearbeiten]Import aus Textdateien
[Bearbeiten]Mit der read.csv
, read.table
und verwandten Funktionen können Daten aus Textdateien (txt) importiert werden. read.table
ist die Basisfunktion zum Import von Textdateien. read.csv
und read.csv2
sowie einige Funktionen mehr sind Anpassungen an häufig auftretenden Fälle. CSV ist z.B. das Standardexportformat für viele Tabellenkalkulationen und andere Anwendungen, unterscheidet sich aber, je nachdem ob als Dezimaltrennzeichen der Punkt (englischer Sprachraum) oder das Komma (bei uns) verwendet wird.
Legen Sie eine txt-Datei mit folgendem Inhalt an, indem Sie die folgenden Zeilen markieren, kopieren und in einen Texteditor einfügen:
Geschlecht Alter Gewicht Groesse m 28 80 170 w 18 55 174 w 25 74 183 m 29 101 190 m 21 84 185 w 19 74 178 w 27 65 169 w 26 56 163 m 31 88 189 m 22 78 184
Speichern Sie diese Textdatei unter dem Namen „Tabellentest.txt“ auf Ihre Festplatte. Nun können Sie die Tabelle mit der Funktion read.table() in R einlesen:
> meinetabelle <- read.table("/Pfad/zur/Tabelle.txt", header=TRUE)
Das Argument header=TRUE besagt, dass die erste Zeile der Datei keine Daten enthält, sondern die Bezeichnungen (Variablen) der Tabellenspalten angibt.
Die Tabelle ist nun in dem Objekt meinetabelle vorhanden. Sie können sie sich ansehen, indem Sie eingeben:
> meinetabelle
Geschlecht Alter Gewicht Groesse 1 m 28 80 170 2 w 18 55 174 3 w 25 74 183 4 m 29 101 190 5 m 21 84 185 6 w 19 74 178 7 w 27 65 169 8 w 26 56 163 9 m 31 88 189 10 m 22 78 184
In unserem Beispiel waren die Daten jeweils mit einem Leerzeichen getrennt. Haben Sie eine Textdatei, in welcher die Daten durch einen Tab getrennt sind, müssen sie die read.table-Funktion um das Argument sep=“\t“
erweitern:
> meinetabelle <- read.table("/Pfad/zur/Tabelle.txt", sep=“\t“, header=TRUE)
Wurden die Daten von einer Tabellenkalkulation, wie z.B. Excel, aber auch aus Statistikprogrammen, als CSV-Datei (comma separated values) exportiert, dann muss noch unterschieden werden, welche Schreibkonvention verwendet wurde. Bei englischsprachiger Software wird der Punkt als Dezimaltrennzeichen verwendet und das Komma, um die verschiedenen Werte voneinander zu trennen. In diesem Fall ist read.csv
zu verwenden. Sofern das Komma als Dezimaltrennzeichen dient und der Strichpunkt (;) die einzelnen Werte voneinander trennt, dann kommt read.csv2
zum Einsatz.
Tipp: Bei CSV-Dateien kommt es leicht zu Problemen, wenn Textvariablen, z.B. mit Kommentaren, vorhanden sind. Diese können das jeweilige Trennzeichen enthalten. Beim Import kommt es dann dazu, dass nachfolgende Felder mit falschen Inhalten gefüllt werden. Nicht jedes importierende Programm gibt eine Fehlermeldung aus, obwohl mehr Felder als erwartet auftreten. Das gilt auch für R. Eine Abhilfe besteht darin, ein alternatives Trennzeichen zu verwenden, das garantiert nicht in den Textvariablen auftritt, z.B. @ (wenn es sich nicht zufällig um Emailadressen handelt). Allerdings ist das nicht mit allen Programmen möglich. Eine weitere Möglichkeit besteht darin, Stringvariablen in Anführungszeichen zu setzen. Auch das ist nicht immer möglich. Im ungünstigsten Fall müssen die Textvariablen nachbearbeitet und das jeweilige Trennzeichen ersetzt werden. Auf jeden Fall ist es erforderlich die Daten nach dem Import auf Fehler zu kontrollieren. Bei R führt das zusätzliche Datenfeld dazu, dass ein zusätzlicher Fall angelegt wird, der durchgängig mit fehlenden Werten (NA) belegt ist. Mit dim(x) kann einfach überprüft werden, ob mehr Fälle als erwartet vorliegen. |
Import aus dem Zwischenspeicher / Clipboard
[Bearbeiten]Analog dem Import aus Textdateien kann statt einer File bei read.table auch stdin() als Quelle angegeben werden. In diesem Fall wartet R auf Texteingaben. Wenn sich im Zwischenspeicher eine Tabelle befindet, kann diese per Copy and Paste übernommen werden.
> a <- read.table(file=stdin(),header=T) 0: Name Geschlecht Lieblingsfarbe # R wartet auf Eingabe 1: Hans m gruen 2: Waldemar w blau 3: Tanja m rosa 4: # Return in leerer Zeile schließt Eingabe ab > a Name Geschlecht Lieblingsfarbe 1 Hans m gruen 2 Waldemar w blau 3 Tanja m rosa
Dies ist oft die einfachste Variante des Imports, wenn aus Browsern oder PDF-Files Tabellen übernommen werden sollen, die bereits hinreichend formatiert sind.
Tipp: Wenn die Daten aus einer HTML-Seite übernommen werden, ist die Verwendung des Webbrowser Firefox in Verbindung mit dem Add-On Table2Clipboard hilfreich.
Wenn die Standardeinstellung mit Tabulator-Trennung Probleme macht, funktioniert zum Beispiel die Parameterkombination row-seperator: "\n", column-seperator: "@" in Table2Clipboard und read.table(file=stdin(),header=T,dec=".",sep="@") in R. |
Import aus MySQL
[Bearbeiten]Um aus R auf eine MySQL-Datenbank zugreifen zu können, muss das Paket RMySQL installiert sein. Es benötigt zusätzlich das Paket DBI (und unter Windows die Datei libmySQL.dll
, die in MySQL enthalten ist).
library(RMySQL) # package RMySQL laden drv = dbDriver("MySQL") # MySQL verwenden # Verbinde mit einer Datenbank con = dbConnect(drv,"user/password@dbname") # Verbinde mit einer Datenbank und verwende Benutzer/Passwort aus der Datei .my.cnf con = dbConnect(drv,"dbname") # Andere Möglichkeit con <- mysqlNewConnection(drv,"dbname","user","password") # listet alle Tabellen auf dbListTables(con) # Anfrage rs <- dbGetQuery(con,"SELECT COUNT(*) FROM mytable")
Hilfreich sind auch die Funktionen mysqlReadTable
und mysqlWriteTable
.
Import aus SPSS
[Bearbeiten]Sie können Ihre vorliegenden SPSS-Daten in R importieren. Hierzu müssen Sie allerdings zunächst ein Zusatzpaket in R installieren. Funktionen zum Datenimport aus SPSS bieten beispielsweise die Pakete foreign und Hmisc. Sie installieren also zunächst eines der Zusatzpakete per:
install.packages("foreign", dependencies = TRUE)
oder
install.packages("Hmisc", dependencies = TRUE)
Das Argument dependencies=TRUE besagt, dass alle weiteren relevanten Zusatzpakete, die eventuell für foreign und Hmisc benötigt werden, direkt mitinstalliert werden. Bevor sie die Funktionen der Zusatzpakete nutzen können, müssen Sie diese aktivieren per:
library(foreign) oder library(Hmisc)
Der Import kann nun über die folgenden Funktionen erfolgen:
- read.spss() (aus dem foreign-Paket)
- spss.get() (aus dem Hmisc-Paket)
Dies geschieht mit der read.spss-Funktion beispielsweise so:
meinspss <- read.spss("/der/pfad/zur/SPSSdatei.sav")
Beachten Sie, dass Sie den kompletten Pfad zur SPSS-Datei angeben müssen. Auf Windows-Systemen werden Pfadangaben normalerweise mit einem Backslash (\) dargestellt. Dies funktioniert in R nicht, da der Backslash in R ein Steuerungszeichen ist. Die übliche Schreibweise in R mit dem Schrägstrich (/) funktioniert aber auch unter Windows einwandfrei. Falls unter Windows der Backslash beibehalten werden soll, muss jeder Backslash durch zwei Backslashes ersetzt werden (z.B. C:\\Pfad\\zur\\SPSSdatei.sav
).
Sind in der SPSS-Datei nominale Daten vorhanden, deren numerische Ausprägungen mit Labels hinterlegt sind (z.B. bei einer Variable „Geschlecht“ sind die Ausprägungslabels 0=weiblich, 1=männlich gesetzt), so werden die ausgeschriebenen Labels als Variablenwert in R übernommen
Wenn Sie möchten, dass nicht die Variablenlabels, sondern die numerischen Ausprägungen (z.B. Geschlecht = 0;1) übernommen werden, muss der Befehl um das Argument use.value.labels=FALSE
erweitert werden:
meinspss <- read.spss("/pfad/zur/SPSSdatei.sav", use.value.labels=FALSE)
Jetzt sind in dem Objekt meinspss die Daten der SPSS-Datei vorhanden. Sie können sie sich ansehen, indem Sie eingeben:
meinspss
Tipp: Für Variablennamen mit Umlauten können beim Import aus SPSS-Dateien Probleme auftreten. Deshalb ist es möglicherweise notwendig vor dem Import die Sprachoptionen richtig zu setzen (z.B. Sys.setlocale(locale="de_DE.ISO8859-15") ). read.spss übernimmt auch die in SPSS vergebenen Variablenlabels, allerdings als spezielles Attribut. Diese können über attr(meinspss,"variable.labels") als Vektor ausgegeben und entsprechend als Titel für Tabellen und Graphiken weiter verwendet werden. ( Als Beispiel, wie sich SPSS-Labess in R importiert lassen, dient dieses Skript. ) |
Import aus XML
[Bearbeiten]Grundsätzlich gibt es zwei Mechanismen zum importieren von Daten aus einer XML Datei.
- Suche eine Element mit folgenden Eigenschaften (dafür gibt XPath)
- Wenn du über ein Element mit folgenden Eigenschaften stolperst tue dies
Das erstere ist einfacher und das zweite effizienter.
Nehmen wir folgende XMLDatei an:
<root> <child1> <child2>data1</child2> <child2>data2</child2> </child1> </root>
In beiden Fällen brauchen wir:
install.packages(XML) library(XML)
Für die erste Variante:
xmlobj <- xmlTreeParse(xmlfile) data <- xpathSApply(xmlobj, "/root/child1/*", xmlValue(x))
Die zweite Variante:
data <<- list() counter <<-1 state <<- F xmlEventParse(xmlfile,useTagName=F,addContext=F,handlers=list( startElement=function(name,...){ if(!state) { if(name=="child2") state<<- T else {} }}, text=function(name,...){ if(state) { data[[counter]]<<-name counter<<-counter+1 }}, endElement=function(name,...){ if(state) { if(name=="child2") state<<- F else {} }}))
Man sieht sofort, dass man die zweite Variante nur benutzen will, wenn die erste unglaublich langsam ist.
Import aus Excel-Dateien und CSV-Dateien
[Bearbeiten]Excel Dateien können auf verschiedenen Wegen in R importiert werden. Welcher Weg für den Benutzer der Richtige ist hängt von folgenden Bedingungen ab:
- Excel-Version,
- Umfang der Daten,
- Strukturierung der Daten.
Excel ist sehr weit verbreitetes Programm zur Verarbeitung von Tabellen. Es gibt diverse Versionen dieser Software und durch die kontinuierliche Weiterentwicklung von Excel gibt es auch verschieden Versionen des Excel Dateiformats. Für die verschiedenen Excel Formate gibt es Importmöglichkeiten in R z.B. via eines Datenbanktreibers.
Neben diesen Importmöglichkeiten gibt es den oft praktikableren Weg, die Datei im Excel Format in eine CSV (Comma-Separated Values) Datei umzuwandeln. Dazu kann man Excel selbst aber auch andere Programme wie Open Office verwenden. Der Nachteil dieses Weges ist, dass man nur eine Tabelle umwandeln kann. Oft bestehen Excel Dateien aus mehreren Tabellen. Nach der Umwandlung kann man die CSV Datei in R wie folgt einlesen:
tt = read.csv("t.csv")
Hier wird die Datei t.csv aus dem aktuellen Arbeitsverzeichnis in die Variable tt vom Typ "list" eingelesen. Alternativ kann auch folgende Anweisung verwendet werden:
tt = read.table("t.csv", sep=",")
Die Option "sep" legt fest, welches Zeichen R als Zelltrenner in der Datei interpretieren soll. Weitere Optionen sind unter GNU R: read.table zu finden.
HDF5 Export/Import
[Bearbeiten]HDF5 unterstützt eine performante Speicherung von potenziell sehr grossen R-Objekten wie Vektoren, Matrizen und Arrays in einem Programmiersprachen unabhängigen Binärformat. HDF5 kann daher als alternative zu R's implementierten save/load Funktionen verwendet werden. Da es mit HDF5 auch möglich ist, nur Subsets von gespeicherten Daten einzulesen können damit auch Datensätze verarbeitet werden, die grösser als der Computer-RAM sind.
Das auf CRAN verfügbare Paket h5 implementiert das HDF5 Interface, siehe auch
http://cran.r-project.org/web/packages/h5/index.html
library(h5) # Erstelle einen Integer-Vektor, eine Numeric-Matrix und ein Character-Array testvec <- as.integer(rnorm(100) * 100) testmat <- matrix(rnorm(120), ncol = 3) testarray <- array(LETTERS[c(1:26, 1:26)], c(2, 2, 13)) # Speichere Objekte in HDF5-File file <- h5file("test.h5") file["testgroup", "testmat"] <- testmat file["testgroup", "testvec"] <- testvec file["testgroup", "testarray"] <- testarray h5close(file)
Inhaltsverzeichnis[Bearbeiten]
|