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")
)readxlbenö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
encodingan; 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)
| Reader | Dateityp | Ungefähre Ladezeit | Speicherbedarf | Hinweise |
|---|---|---|---|---|
data.table::fread | CSV | ~3–4s | Gering | Am schnellsten für flache Dateien; gute Typ-Erkennung. |
readr::read_csv | CSV | ~6–8s | Gering–mittel | Klare Parse-Fehler; ausgezeichnete Locale-Kontrolle. |
arrow::read_parquet | Parquet | ~2–3s | Gering | Spaltenorientiert; unterstützt Lazy-Filterung und Multi-File-Datasets. |
readxl::read_excel | XLSX | ~8–12s | Mittel | Am 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_typesodercolClassesfestlegen. localeundencodingdeklarieren, um schleichende Zeichenänderungen zu vermeiden.- Ein schlankes Schema halten: Unbenötigte Spalten bereits beim Import verwerfen.
- Nach jedem Ladevorgang
nrow()undsummary()protokollieren, um Anomalien früh zu erkennen.
Verwandte Anleitungen
- Aufbereitung nach dem Import: R dplyr Data Wrangling Pipeline
- Schnelle Plot-Rezepte: R ggplot2 Quickstart
- Tidy-Frames von Hand aufbauen: How to Create a Dataframe in R