Teile diesen Beitrag:

Hej Leute,

jeder, der mit R zu tun hat, kennt es. Wir wollen unsere Daten natürlich nicht nur in R behalten, sondern in die große weite „Software“-Welt heraustragen. Doch wie geht das? Wenn wir noch nicht irgendwelche funky APIs oder Datenbanken benutzen, ist der Standard aktuell noch die gute alte csv-Datei. Doch R hat noch mehr Formate zu bieten – durch entsprechende Packages bekommt man eine ganze Menge Dateiformate auf dem Silberteller präsentiert. So sind vor allem Excel (siehe mein separaten Artikel zum Einlesen und Schreiben von xlsx-Dateien), aber auch SPSS und SAS häufig gebrauchte Programme, so dass wir unsere schön berechneteten Dataframes dort zur Verfügung haben wollen.

Arbeitsverzeichnis

R speichert Dateien, wenn nicht anders angegeben, im Arbeitsverzeichnis (englisch: working directory). Dieses können wir mit getwd() abfragen und mit setwd(Verzeichnis) setzen. Windows-Nutzer aufgepasst: R benutzt den Backslash \ als Escape-Sequenz (d.h. damit werden Sonderzeichen eingeleitet), deshalb müssen wir stattdessen den Forward-Slash / oder einen doppelten Backslash nehmen \\.

 

R-interne Formate

Ok, klar benötigen wir erstmal Export-Funktionen für die nativen R-Formate. Diese sind natürlich dann sinnvoll, wenn wir die Daten wieder in R einlesen wollen. Das geht am schnellsten und die Datentypen (character, numeric, …) bleiben auch erhalten.

Es gibt zwei native Datenformate in R, nämlich RData und RDS. In eine RData-Datei können ein oder mehrere R-Objekte wie zum Beispiel dataframes geschrieben werden. Mit load("dateiname.RData") wird die Datei wieder geladen. Zu beachten ist, dass die Benennung der Objekte gleich bleibt. Benutzt also möglichst sprechende Namen, damit ihr beim Laden nicht ausversehen vorhandenes überschreibt. Zweite Möglichkeit ist das RDS-Format, welches aber nur ein Objekt speichern kann. Der entsprechende Lese-Befehl ist df <- readRDS("dateiname.rds"). Hierbei kann ich also – im Gegensatz zur RData-Datei – den Variablennamen zuweisen.

RData

Wie schon geschrieben, können im RData-Format ein, mehrere oder direkt alle vorhandenen Objekte gespeichert werden. Meiner Meinung nach macht dieses Format Sinn, wenn man tatsächlich eine ganze Reihe von Objekten speichern will. Sei es, wenn man die Arbeit unterbrechen muss und das Skript nicht von vorne laufen lassen möchte. Oder wenn man mehrere Skripte nacheinander ausführt und das zweite soll genau den Variablen-Stand vom ersten übernehmen. Wenn es nur um einzelne Objekte geht, ist man mit dem RDS-Format besser aufgestellt, da man da den Variablennamen wählen kann.

# mehrere Dataframes in eine Datei schreiben:
save(df1, df2, file=“dateiname.RData“)

# Alle Objekte des aktuellen Arbeitsraums speichern
save.image(file = „Backup.RData)

RDS

Auch hier ist das Speichern super einfach. Als erster Parameter kommt das Objekt, dann der Dateiname.

 

Standard-Formate

csv-Datei

csv steht für comma separated values (Komma-getrennte Werte) und ist das einfachste Format für Tabellen. Um etwas Verwirrung zu stiften, das Komma im Namen muss kein Komma sein, d.h. wir können auch andere Trennzeichen, z.B. Semikolon, Pipe | oder etwas anderes definieren. Vorteil ist wie gesagt die Einfachheit des Formats, so dass wirklich alle Daten-Programme (auch Excel) etwas damit anfangen können. Nachteile sind fehlende Komprimierung und Formatierungsmöglichkeiten. Die fehlende Komprimierung macht die Datei verhältnismäßig groß, die fehlenden Formatierungsmöglichkeiten sorgen dafür, dass die Datei nicht schön ausschaut.

Fazit: Benutze csv-Dateien, um Daten zwischen verschiedenen Programmen auszutauschen

Die eigentliche Funktion ist write.table, mit der ein dataframe in eine csv-Datei geschrieben werden kann. Daneben gibt es write.csv und write.csv2, welche bequemerweise schon ein paar Parameter setzen, damit man das nicht selber tun muss.

Dabei gibt es noch eine Menge Parameter

  • append
    Standardmäßig ist append = FALSE, d.h. die angegebene Datei wird überschrieben. Setzt man append aber auf TRUE, dann werden die Daten an die bestehende Datei angehangen.
  • quote
    Jeder String oder Faktor wird mit Anführungszeichen versehen, wenn quote = True, was auch die Standardeinstellung ist. Das ist sehr sinnvoll, da dann zum Beispiel ein Semikolon im String nicht dazu führt, dass es als Trennzeichen angesehen und in die nächste Spalte gesprungen wird.
  • sep
    Das Trennzeichen kann mit sep geändert werden. Bei write.csv ist es ein Komma, bei write.csv2 ist es ein Semikolon.
  • eol
    Die Sequenz, die das Zeilenende bedeutet. So können zum Beispiel auf Unix-Maschinen mit eol = „\r\n“ die Standard-Windows-Zeilenenden verwendet werden. Im Normalfall braucht man sich aber nicht groß darum zu kümmern.
  • na
    Hier kann definiert werden, wie fehlende Werte (NAs) in der Datei aussehen. Standardmäßig ist das Feld leer („“).
  • dec
    Zeichen des Dezimalpunkts. Bei write.csv ist es der Punkt „.“, bei write.csv2 das Komma „,“
  • row.names
    Wenn die Zeilennamen mitgeschrieben werden sollen, dann kann man das mit diesem Parameter angeben. Entweder auf TRUE setzen oder einen Vektor mit allen Zeilennamen übergeben.
  • col.names
    Wenn die Spaltennamen geschrieben werden soll (sehr zu empfehlen und bei write.csv und write.csv2 Standard), setzt man diesen Parameter auf TRUE oder liefert einen Vektor mit den zu verwendenden Spaltennamen.
  • qmethod
    Es gibt ein Problem, wenn Anführungszeichen in einem String auftauchen. Denn der String wird ja von Anführungszeichen umschlossen. Man kann entweder „escape“ wählen, dann wird ein Backlash davorgestellt. Oder man wählt „double“ (Standard bei write.csv und write.csv2), dann wird das Anführungszeichen verdoppelt.
  • fileEncoding
    Hier kann man das encoding der Datei angeben, also z.B. „UTF-8“.

 

txt-Datei

Bei Text-Dateien, die Daten enthalten, spricht man von sogenannte tab-delimited files, d.h. die einzelnen Werte werden durch TABs getrennt. Für dieses Dateiformat gilt eigentlich das gleiche wie für das csv-Format: es ist ein universelles Format zum Austausch von Daten zwischen Programmen und jede normale Daten-Software unterstützt diese Dateien.

 

JSON

JSON ist die Abkürzung für JavaScript Object Notation und wurde zum Zweck des schlanken Datenaustauschs, meist zwischen Sever und Client, entwickelt. Es ist gut vom Menschen lesbar. Wer mehr wissen will, liest sich doch einfach mal den JSON-Artikel bei Wikipedia vorbei, in dem übrigens auch die Abgrenzung zu XML behandelt wird.

library(RJSONIO)
write(jsonObject, file="dateiname.json")

 

XML

XML ist die Abkürzung für eXtensible Markup Language und ähnlich wie JSON ein Datenaustauschformat, jedoch mit mehr Möglichkeiten. XML dient der Darstellung hierarchischer Daten in einer Textdatei. Für die interessierten empfehle ich ebenfalls den XML-Artikel bei Wikipedia.

library(XML)
saveXML(XMLObject, file=”dateiname.xml”)

 

Excel: xlsx und xls-Datei

Excel-Dateien haben die Endung xlsx oder xls, wobei xls das ältere Format ist (bis Excel 2003) und xlsx das neuere (ab Excel 2007). Wichtigste Unterschiede sind die maximale Tabellengröße (xls: 65.536×256, xlsx: 1.048.576×16.384) sowie die Komprimierung in xlsx-Dateien, so dass die Dateigröße deutlich schrumpft.

Schau mal in meinen Artikel Excel-Dateien in R einlesen und schreiben. Hier der R-Code zum Schreiben von xlsx und xls-Dateien (Package xlsx muss installiert sein)

library(xlsx)
write.xlsx(df, "dateiname.xlsx")

SPSS/SAS/STATA – Das Package foreign

Das Package foreign ist das Schweizer Taschenmesser der Statistikprogramm-Dateiformate, es versteht SPSS, SAS und STATA. Dabei schreibt foreign zwei Dateien, zum einen den Dataframe als Textdatei ohne Formatierung und zum anderen eine Codedatei (mit der entsprechenden Endung)

SPSS

library(foreign)
write.foreign(df, "dateiname.txt", "dateiname.sps",   package="SPSS")

SAS

library(foreign)
write.foreign(df, "dateiname.txt", "dateiname.sas",   package="SAS")

Optional kann noch der Datenname für SAS gewählt werden (dataname = „xyz“). Soweit ich weiß, gibt es kein Package, welches das SASb7dat-Format schreiben kann (wohl aber lesen). Optional

STATA

library(foreign)
write.dta(df, "df.dta")

 

Macht’s gut und happy Coding,

Euer Holger

Teile diesen Beitrag: