Skip to content

Daten in R importieren: Schnelle, korrekte und reproduzierbare Ladevorgänge

Problem

Langsame Dateiladevorgänge und fehlerhafte Zeichen verderben Analysen, bevor sie beginnen. Teams verschwenden Zeit damit, Import-Code für jeden neuen CSV- oder Excel-Drop neu zu schreiben.

Agitation

Falsche Encodings zerstören Nicht-ASCII-Text, führende Nullen in IDs verschwinden und große CSV-Dateien überlasten den Speicher. Jeder erneute Lauf untergräbt das Vertrauen in den Datensatz und verzögert Modellierung oder Reporting.

Lösung

Verwende spezialisierte R-Reader mit expliziter Kontrolle über Locale, Trennzeichen und Datentypen. Die folgenden Muster halten Importe schnell, typstabil und über verschiedene Rechner hinweg reproduzierbar.

CSV und TSV: readr-Defaults mit expliziter Locale

library(readr)
 
orders <- read_csv(
  "data/orders.csv",
  locale = locale(encoding = "UTF-8", decimal_mark = ".", grouping_mark = ","),
  col_types = cols(
    order_id = col_character(),
    order_date = col_date(format = "%Y-%m-%d"),
    revenue = col_double(),
    region = col_character()
  )
)
  • Setze col_types, damit R nicht eigenständig Faktoren rät oder IDs abschneidet.
  • Nutze read_tsv() für tab-separierte Dateien; read_delim(delim = ";") für Semikolons.

Excel: readxl für xls/xlsx

library(readxl)
 
budget <- read_excel(
  "data/budget.xlsx",
  sheet = "FY24",
  range = "A1:G200",
  col_types = c("text", "numeric", "numeric", "date", "text", "numeric", "numeric")
)
  • readxl benötigt kein Java und erhält Zellformatierungen stabil.
  • Headerzeilen mit skip = überspringen und nur den benötigten Bereich wählen, um Geschwindigkeit zu gewinnen.

Große CSVs: data.table::fread

library(data.table)
 
clicks <- fread(
  "data/clicks.csv",
  encoding = "UTF-8",
  colClasses = list(character = "user_id"),
  nThread = 4
)
  • Automatische Erkennung des Trennzeichens; bei Bedarf mit sep = "\t" überschreiben.
  • Mit select = nur benötigte Spalten laden, um Speicher zu sparen.

Spaltenorientierte und mehrsprachige Daten: arrow

library(arrow)
 
events <- read_parquet("data/events.parquet", as_data_frame = TRUE)
 
# Or stream a large dataset by batches
ds <- open_dataset("s3://bucket/events/")  # works locally on folders, too
events_summary <- ds %>%
  filter(country %in% c("DE", "FR")) %>%
  group_by(country) %>%
  summarise(count = n())
  • Arrow erhält Datentypen und verwendet standardmäßig UTF-8.
  • Verwende es für Interoperabilität mit Python/SQL-Engines und für Filterung außerhalb des Speichers.

Encodings und Trennzeichen handhaben

  • Gib für mehrsprachige Daten immer ein encoding an; bevorzuge durchgängig UTF-8.
  • Für europäische CSVs locale(decimal_mark = ",", grouping_mark = ".") setzen.
  • Wenn sich Trennzeichen unterscheiden, mit einem kleinen Import testen: read_delim(..., n_max = 20), um das Parsing zu überprüfen.

Kleiner Benchmark (1 Mio. Zeilen, 8 Spalten, SSD)

ReaderDateitypUngefähre LadezeitSpeicherbedarfHinweise
data.table::freadCSV~3–4sGeringAm schnellsten für flache Dateien; gute Typ-Erkennung.
readr::read_csvCSV~6–8sGering–mittelKlare Parse-Fehler; ausgezeichnete Locale-Kontrolle.
arrow::read_parquetParquet~2–3sGeringSpaltenorientiert; unterstützt Lazy-Filterung und Multi-File-Datasets.
readxl::read_excelXLSX~8–12sMittelAm besten für Business-Workbooks; langsamer bei sehr breiten Tabellen.

Zeiten variieren je nach Hardware; die Tabelle dient nur als relative Orientierung.

Checkliste für reproduzierbare Importe

  • Spaltentypen mit col_types oder colClasses festlegen.
  • locale und encoding deklarieren, um schleichende Zeichenänderungen zu vermeiden.
  • Ein schlankes Schema halten: Unbenötigte Spalten bereits beim Import verwerfen.
  • Nach jedem Ladevorgang nrow() und summary() protokollieren, um Anomalien früh zu erkennen.

Verwandte Anleitungen