Menu

CSV-Dateien in R einlesen (read.csv und read_csv)

Wie du CSV-Dateien mit read.csv() nach R importierst - die Argumente, die zählen, die Arbeitsverzeichnis-Falle hinter den meisten Fehlschlägen und wann sich readr::read_csv lohnt.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

read.csv() macht aus einer CSV-Datei einen Data Frame

Eine CSV in R einzulesen ist ein Funktionsaufruf, in die Sprache eingebaut - kein Paket erforderlich:

sales <- read.csv("sales.csv")

read.csv() liest die Datei, nutzt die erste Zeile als Spaltennamen, rät für jede Spalte einen Typ und gibt einen Data Frame zurück. Das ist die ganze Geschichte für eine wohlerzogene Datei.

Du kannst ihm ganz ohne Datei bei der Arbeit zusehen, denn read.csv() akzeptiert über das Argument text auch rohen CSV-Text - derselbe Parser, gefüttert mit einer Zeichenkette statt eines Dateinamens:

str() ist das Erste, was du auf allem ausführst, was du importierst: Es zeigt jede Spalte mit ihrem geratenen Typ. Hier kam name als character, score als integer und passed als logical - alles aus den Werten geraten. Für eine schnelle Sichtprüfung zeigt head(students) die ersten Zeilen und nrow(students) zählt sie. Erscheint eine Spalte, die du numerisch erwartet hast, als chr, ist etwas in dieser Spalte keine Zahl - ein verirrter Kommentar, ein "N/A", ein Tausendertrennzeichen - und das ist der Moment, es zu beheben, nicht drei Diagramme später.

Die Argumente, die zählen

read.csv() hat Dutzende Parameter; du wirst etwa fünf nutzen.

header - ob die erste Zeile Spaltennamen enthält. Standard ist TRUE. Beginnt deine Datei direkt mit Daten, übergib header = FALSE, und R benennt die Spalten V1, V2, ...

sep - das Feldtrennzeichen, Standard ",". Weite Teile Europas schreiben CSVs mit Semikolon als Trennzeichen, weil dort das Komma das Dezimalzeichen ist. R bringt genau dafür eine vorkonfigurierte Variante mit: read.csv2() nutzt sep = ";" und dec = ",":

Die Größen kommen als richtige Zahlen heraus - read.csv2 wusste, dass 1,63 eins Komma dreiundsechzig bedeutet. Hättest du auf diese Datei das schlichte read.csv angewandt, bekämest du eine verhunzte Spalte, denn nichts trennt korrekt an einem Komma, das ein Dezimalzeichen ist.

na.strings - welche Zeichenketten als fehlend gelten. Standardmäßig wird nur "NA" zu einem fehlenden Wert. Reale Exporte schreiben fehlende Daten als leere Zellen, "missing", "-", "NULL" - und solange du das nicht erklärst, kommen sie als Text an und ziehen die ganze Spalte auf character:

Mit den richtigen na.strings werden die Leerstellen zu echten NAs, und score bleibt numerisch. Ohne das ist "missing" bloß ein Wort, und die Spalte ist Text.

skip - Zeilen, die vor Beginn der Daten ignoriert werden. Exporte lieben es, ein oder zwei Titelzeilen über die eigentliche Tabelle zu setzen; skip = 2 überspringt sie.

colClasses - Spaltentypen erzwingen, statt R raten zu lassen. Das klassische Opfer ist alles mit führenden Nullen - Postleitzahlen, Telefonnummern, Produkt-IDs -, was R's Rater als Zahlen liest und die Nullen zerstört:

Aus 00501 wurde 501. Die Daten waren in der Datei korrekt und in R falsch, und zwar still. colClasses = c("integer", "character") sagt dem Parser der Reihe nach, was jede Spalte ist, und die Nullen überleben.

Ein Argument, das du nicht mehr brauchst: stringsAsFactors. Den größten Teil von R's Geschichte hindurch wandelte read.csv() jede Textspalte in einen Faktor um, sofern du nichts anderes sagtest, was enorme Verwirrung stiftete. Seit R 4.0 ist die Voreinstellung FALSE - Text bleibt Text. Du wirst stringsAsFactors = FALSE weiterhin in älteren Tutorials verstreut sehen; in einem aktuellen R ist es harmlos, aber überflüssig.

Dateipfade: Grund Nr. 1, warum read.csv scheitert

Der Fehler, dem jede R-Lernende in Woche eins begegnet:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory

Die Datei existiert - du siehst sie in deinem Dateimanager. Aber R schaut nicht dorthin. Ein nackter Dateiname wie "sales.csv" wird relativ zu R's Arbeitsverzeichnis aufgelöst, und das ist meist nicht der Ordner, in dem deine Datei liegt. Zwei Zeilen diagnostizieren es:

getwd()                    # where R is actually looking
file.exists("sales.csv")   # FALSE means the path is wrong, full stop

Sagt file.exists() FALSE, hilft kein noch so häufiges Wiederholen - korrigiere den Pfad. Gib entweder den vollständigen Pfad an (read.csv("C:/Users/ada/data/sales.csv") - Schrägstriche funktionieren auch unter Windows und sind sicherer als Backslashes) oder verschieb R's Arbeitsverzeichnis mit setwd() in den Datenordner. Was das Arbeitsverzeichnis ist, wie Projekte es verwalten und warum setwd() in Skripten verpönt ist, behandelt Arbeitsverzeichnis.

Mach file.exists() zum Reflex. Es verwandelt "rätselhafter Importfehler" in einer Sekunde in "Tippfehler in einem Pfad".

Eine CSV direkt von einer URL lesen

read.csv() akzeptiert überall dort eine URL, wo es einen Dateinamen akzeptiert, und lädt die Datei für dich herunter:

url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)

Das ist praktisch für Tutorials und öffentliche Datensätze - kein Downloadschritt, keine Pfadprobleme. Der Preis ist, dass dein Skript nun vom Netzwerk und davon abhängt, dass diese URL am Leben bleibt; für alles, was du häufig erneut ausführst, lade einmal herunter und lies die lokale Kopie.

readr::read_csv - die schnellere, gesprächigere Alternative

Das Tidyverse bringt im Paket readr einen eigenen CSV-Leser mit: read_csv() (Unterstrich, kein Punkt). Es lohnt sich, ihn zu kennen, denn der meiste moderne R-Code, den du liest, nutzt ihn:

install.packages("readr")   # once
library(readr)              # every session

flights <- read_csv("flights.csv")

Die praktischen Unterschiede zu read.csv():

  • Geschwindigkeit - merklich schneller bei Dateien mit Hunderttausenden Zeilen.
  • Es gibt ein Tibble zurück - einen modernisierten Data Frame, der eine kompakte Vorschau ausgibt, statt deine Konsole zu fluten.
  • Es meldet seine Vermutungen - nach dem Einlesen gibt es den erkannten Typ jeder Spalte aus, sodass eine Spalte, die als character geparst wurde, obwohl du Zahlen erwartet hast, sofort sichtbar ist, statt später zur Überraschung zu werden.
  • Es verhunzt nie Spaltennamen - read.csv() schreibt eine Kopfzeile wie first name zu first.name um; read_csv() lässt sie unverändert.

Bei einer kleinen Datei ist jede der Funktionen in Ordnung. Greif zu read_csv(), wenn Dateien groß werden oder der Rest deines Skripts ohnehin Tidyverse ist. Alles oben zu Pfaden, Trennzeichen (read_csv2() gibt es auch) und Zeichenketten für fehlende Werte (na =) überträgt sich mit leicht anderen Argumentnamen.

Wenn du mit der Analyse fertig bist, ist der Rückweg - deine Ergebnisse in eine Datei exportieren - write.csv.

Was du mitnimmst

  • df <- read.csv("file.csv") liest eine CSV in einen Data Frame; prüfe ihn sofort mit str() und head().
  • read.csv(text = "...") parst eine CSV-Zeichenkette direkt - super für Experimente und kleine Beispiele.
  • Die Argumente, die sich lohnen: header, sep (oder read.csv2 für Semikolons), na.strings, skip, colClasses.
  • "Cannot open file" bedeutet, dass das Arbeitsverzeichnis nicht dort ist, wo du denkst - getwd() und file.exists() klären es sofort.
  • readr::read_csv() ist die schnellere Tidyverse-Variante: Tibbles, gemeldete Spaltentypen, unangetastete Namen.

Als Nächstes: Dateien, die gar kein reiner Text sind - Excel-Tabellen mit dem Paket readxl lesen.

Häufig gestellte Fragen

Wie liest man eine CSV-Datei in R ein?

Mit read.csv("file.csv") - eingebaut, kein Paket nötig. Es gibt einen Data Frame mit einer Spalte je CSV-Spalte zurück und nutzt die erste Zeile als Spaltennamen. Weise das Ergebnis einer Variablen zu: df <- read.csv("sales.csv"), und prüfe es dann mit str(df) und head(df).

Warum sagt read.csv 'cannot open file: No such file or directory'?

R sucht die Datei relativ zu seinem Arbeitsverzeichnis, das vermutlich nicht der Ordner ist, in dem deine Datei liegt. Führ getwd() aus, um zu sehen, wo R sucht, und file.exists("file.csv"), um den Fehlschlag zu bestätigen. Behebe es mit einem vollständigen Pfad oder indem du das Arbeitsverzeichnis auf den Ordner der Datei setzt.

Was ist der Unterschied zwischen read.csv und read_csv in R?

read.csv() ist Base R - immer verfügbar, gibt einen schlichten Data Frame zurück. read_csv() kommt aus dem Paket readr - es ist bei großen Dateien schneller, gibt ein Tibble zurück, fasst deine Spaltennamen nie an und gibt die erkannten Spaltentypen aus, sodass du fehlerhaftes Parsen sofort bemerkst. Bei kleinen Dateien ist beides in Ordnung; bei großen Dateien oder Tidyverse-Pipelines nimm read_csv().

Wie liest man in R eine semikolongetrennte CSV ein?

Nutze read.csv2("file.csv") - das ist read.csv, vorkonfiguriert für die europäische Konvention: Semikolon als Trennzeichen und Komma als Dezimalzeichen. Oder übergib sep = ";" (und bei Bedarf dec = ",") an das normale read.csv().

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S