Diese Seite rechnet nichts. Sie listet Befehle mit den wichtigsten Argumenten, damit man beim Arbeiten nachschlagen kann. Die Abschnitte sind in beiden Sprachreferenzen identisch benannt und gleich sortiert, und seit dem 11.09.2026 stehen auch die Zeilen an derselben Stelle: Wer in der einen Referenz die dritte Zeile unter “Data Wrangling” liest, findet in der anderen dieselbe Aufgabe an derselben Stelle.
Die Spalte Bemerkung hält vor allem die Stolpersteine fest — und dort, wo sich die beiden Sprachen unterschiedlich verhalten, steht der Unterschied fett.
Umgebung und Pakete
| Paket installieren |
install.packages("dplyr") |
einmalig in der Konsole, nicht ins Skript |
| Paket laden |
library(dplyr) |
Fehler, wenn das Paket fehlt |
| Funktion ohne Laden benutzen |
dplyr::filter(df, x > 5) |
zeigt die Herkunft und umgeht Namenskonflikte |
| Installierte Version |
packageVersion("dplyr") |
|
| Ist ein Paket vorhanden? |
requireNamespace("dplyr", quietly = TRUE) |
gibt TRUE/FALSE statt eines Fehlers |
| Arbeitsverzeichnis |
getwd(), setwd(pfad) |
in Projekten besser here::here("daten", "x.csv") |
| Sitzungsinformationen |
sessionInfo() |
gehört ans Ende eines Berichts, damit die Versionen dokumentiert sind |
Datenstrukturen
| Vektor |
c(1, 2, 3) |
alle Elemente haben denselben Typ |
| Liste |
list(a = 1, b = "x") |
darf gemischte Typen enthalten |
| Data Frame |
data.frame(x = 1:3, y = c("a", "b", "c")) |
stringsAsFactors ist seit R 4.0 auf FALSE |
| Matrix |
matrix(x, nrow = 3, byrow = TRUE) |
ohne byrow wird spaltenweise gefüllt — der häufigste Unterschied zu Python |
| Faktor |
factor(x, levels = c("klein", "gross"), ordered = TRUE) |
die Reihenfolge der levels bestimmt die Sortierung, nicht das Alphabet |
| Typ und Aufbau ansehen |
class(x), str(x) |
str() ist der schnellste Überblick über einen Datensatz |
| Grösse |
length(x), dim(df), nrow(df), ncol(df) |
|
| Element wählen |
x[1], df$spalte, df[["spalte"]], df[zeile, spalte] |
Zählung ab 1, in Python ab 0 |
| Fehlende Werte |
NA, is.na(x), complete.cases(df) |
NA == NA ergibt NA, deshalb immer is.na() |
| Kopie anlegen |
b <- a |
R kopiert beim Ändern von selbst, siehe Python-Grundlagen |
| Häufigkeiten eines Vektors |
table(x), names(which.max(table(x))) |
|
| Gleitkommazahlen vergleichen |
isTRUE(all.equal(a, b)) |
0.1 + 0.2 == 0.3 ist FALSE |
| Eigene Klasse |
structure(list(...), class = "k"), mittel.k <- function(x, ...) |
S3; mit Verweissemantik setRefClass(), siehe Objektorientierung |
Import und Export
| CSV lesen |
readr::read_csv("daten.csv") |
gibt ein Tibble zurück und meldet die erkannten Spaltentypen |
| CSV mit Semikolon und Dezimalkomma |
readr::read_csv2("daten.csv") |
der übliche Fall bei Exporten aus deutschsprachigem Excel |
| Spaltentypen vorgeben |
read_csv(datei, col_types = cols(plz = col_character())) |
verhindert, dass Postleitzahlen zu Zahlen werden |
| Zeichensatz |
read_csv(datei, locale = locale(encoding = "latin1")) |
bei zerschossenen Umlauten |
| Excel lesen |
readxl::read_excel("datei.xlsx", sheet = 2) |
sheet nimmt Nummer oder Name |
| CSV schreiben |
readr::write_csv(df, "raus.csv") |
|
| R-eigenes Format |
saveRDS(obj, "obj.rds"), readRDS("obj.rds") |
erhält Typen und Attribute, im Gegensatz zu CSV |
| Erster Blick |
head(df), str(df), summary(df) |
in dieser Reihenfolge, bevor gerechnet wird |
Data Wrangling
| Zeilen filtern |
filter(df, x > 5, gruppe == "A") |
mehrere Bedingungen mit Komma wirken wie & |
| Spalten wählen |
select(df, a, b), select(df, -c) |
auch starts_with(), where(is.numeric) |
| Spalte berechnen |
mutate(df, neu = a / b) |
neue Spalten dürfen im selben Aufruf aufeinander aufbauen |
| Sortieren |
arrange(df, x), arrange(df, desc(x)) |
|
| Gruppieren und zusammenfassen |
df |> group_by(gruppe) |> summarise(mittel = mean(x), n = n()) |
.groups = "drop" vermeidet eine Warnung |
| Häufigkeiten |
count(df, gruppe) |
Kurzform für gruppieren und zählen |
| Umbenennen |
rename(df, neu = alt) |
Ziel steht links |
| Doppelte entfernen |
distinct(df), distinct(df, id, .keep_all = TRUE) |
|
| Zusammenführen |
left_join(a, b, by = "id") |
by immer angeben; ohne by rät dplyr anhand gleicher Namen |
| Breit zu lang |
pivot_longer(df, cols = -id, names_to = "jahr", values_to = "wert") |
|
| Lang zu breit |
pivot_wider(df, names_from = jahr, values_from = wert) |
|
| Fallunterscheidung |
case_when(x < 10 ~ "klein", x < 100 ~ "mittel", .default = "gross") |
die erste zutreffende Bedingung gewinnt |
| Spalte als Vektor |
pull(df, x) |
Gegenstück zu df$x in der Pipe |
Datum und Zeit
| Text zu Datum |
lubridate::dmy("31.12.2026") |
der Funktionsname nennt die Reihenfolge: dmy, mdy, ymd |
| Mit festem Muster |
as.Date(x, format = "%d.%m.%Y") |
%Y vierstellig, %y zweistellig |
| Heute und jetzt |
Sys.Date(), Sys.time() |
|
| Bestandteile |
year(x), month(x), day(x) |
aus lubridate |
| Wochentag |
wday(x, label = TRUE, week_start = 1) |
week_start = 1 beginnt die Woche am Montag |
| Auf Monat runden |
floor_date(x, "month") |
der übliche Weg, um Monatsauswertungen zu bilden |
| Differenz |
difftime(a, b, units = "days") |
a - b allein liefert eine Einheit, die R selbst wählt |
| Monate addieren |
x %m+% months(1) |
nicht x + months(1): Der 31. Januar ergäbe dort NA |
| Zeitzone wechseln |
with_tz(x, "Europe/Zurich") |
force_tz() ändert dagegen die Bedeutung des Zeitpunkts |
| Formatiert ausgeben |
format(x, "%d.%m.%Y") |
|
Zeichenketten
| Länge |
stringr::str_length(x) |
nchar() in Basis-R |
| Teilstück |
str_sub(x, 1, 3) |
negative Werte zählen von hinten |
| Enthält? |
str_detect(x, "muster") |
gibt einen logischen Vektor |
| Ersetzen |
str_replace_all(x, "alt", "neu") |
str_replace() ersetzt nur das erste Vorkommen |
| Trennen |
str_split(x, ",") |
Ergebnis ist eine Liste |
| Leerzeichen entfernen |
str_trim(x), str_squish(x) |
str_squish() räumt auch im Inneren auf |
| Gross- und Kleinschreibung |
str_to_lower(x), str_to_title(x) |
|
| Zusammensetzen |
paste0(a, b), str_c(a, b, sep = " ") |
paste() setzt ein Leerzeichen, paste0() nicht |
| Formatiert zusammensetzen |
sprintf("%.2f Prozent", x) |
%.2f zwei Nachkommastellen, %d ganze Zahl, %s Text |
| Reguläre Ausdrücke |
str_detect(x, "^\\d{4}$") |
im R-String wird der Backslash verdoppelt |
Deskriptive Statistik
| Mittelwert und Median |
mean(x), median(x) |
na.rm = TRUE nicht vergessen, sonst ergibt ein NA das Ergebnis NA |
| Streuung |
sd(x), var(x) |
beide teilen durch n - 1 (Bessel-Korrektur) |
| Quantile |
quantile(x, c(0.25, 0.75)) |
type = 7 ist die Voreinstellung und interpoliert |
| Quartilsabstand und Spannweite |
IQR(x), range(x), diff(range(x)) |
|
| Überblick |
summary(df) |
Minimum, Quartile, Mittel, Maximum, Anzahl NA |
| Häufigkeiten |
table(x), table(x, y) |
zweites Argument ergibt eine Kreuztabelle |
| Anteile |
prop.table(tab), prop.table(tab, 1) |
1 zeilenweise, 2 spaltenweise, ohne Angabe über alles |
| Korrelation |
cor(x, y), cor(df) |
method = "spearman" für Ränge, use = "complete.obs" bei NA |
| Spaltenweise |
colMeans(m), apply(df, 2, sd) |
|
| Nach Gruppen |
tapply(df$wert, df$gruppe, mean) |
in dplyr group_by() mit summarise() |
Verteilungen und Zufallszahlen
| Quantil der Normalverteilung |
qnorm(p, mean, sd) |
Umkehrung von pnorm() |
| Gleichmässige Quantilstellen |
ppoints(n) |
ergibt (i - 0.5)/n für n > 10; mit qnorm() kombiniert entstehen deterministische Beispieldaten |
| Normalverteilte Zufallszahlen |
rnorm(n, mean, sd) |
vorher set.seed() |
| QQ-Plot gegen die Normalverteilung |
qqnorm(x); qqline(x) |
zwei Aufrufe, der zweite zeichnet die Referenzgerade |
Hypothesentests
| t-Test, zwei unabhängige Gruppen |
t.test(wert ~ gruppe, data = df) |
Welch ist die Voreinstellung; var.equal = TRUE erzwingt Student |
| t-Test, zwei Vektoren |
t.test(x, y) |
Vorzeichen folgt der Reihenfolge der Argumente |
| Effektstärke Cohens d |
effectsize::cohens_d(wert ~ gruppe, data = df) |
vorzeichenbehaftet, mit Konfidenzintervall |
| Rangtest zweier Gruppen |
wilcox.test(x, y) |
ohne Bindungen und bei kleinem n exakt, sonst Normalapproximation |
| Varianzanalyse |
aov(wert ~ gruppe, data = df) |
mit summary() lesen |
Regression und Modelle
| Lineares Modell schätzen |
lm(y ~ x, data = df) |
|
| Modell lesen |
summary(modell) |
Koeffizienten, R², Residualstreuung, F-Test |
| Konfidenzintervalle der Koeffizienten |
confint(modell) |
steht nicht in summary() |
| Quadratischer Term |
lm(y ~ x + I(x^2), data = df) |
I() schützt das Hochzeichen vor der Formelsyntax |
| Residuen und Vorhersagen |
resid(modell), fitted(modell) |
|
| Residualstreuung |
summary(modell)$sigma |
in Python über np.sqrt(modell.mse_resid) |
| Diagnoseplots |
plot(modell, which = 1) bis which = 6 |
1 Residuen gegen Vorhersage, 2 QQ-Plot |
| Einflussreiche Fälle |
cooks.distance(modell), hatvalues(modell) |
Cook-Distanz über 1 gilt als auffällig |
| Test auf ungleiche Streuung |
lmtest::bptest(modell) |
grosser p-Wert heisst unauffällig |
| Vorhersage für neue Daten |
predict(modell, newdata = df_neu) |
|
Überlebenszeitanalyse
| Paket |
library(survival) |
gehört zur Standardinstallation von R |
| Zielgrösse bilden |
Surv(zeit, ereignis) |
ereignis ist 1 für eingetreten, 0 für zensiert |
| Kaplan-Meier-Schätzung |
survfit(Surv(zeit, ereignis) ~ 1, data = df) |
~ gruppe statt ~ 1 liefert eine Kurve je Gruppe |
| Median und Fallzahlen |
fit (einfach ausgeben) |
NA heisst: Der Median wurde nicht erreicht, nicht dass er fehlt |
| Überlebenswahrscheinlichkeit zu festen Zeiten |
summary(fit, times = c(6, 12, 24)) |
|
| Kurven zeichnen |
plot(fit, conf.int = TRUE) |
conf.type = "log-log" in survfit() entspricht der Voreinstellung von lifelines |
| Gruppen vergleichen |
survdiff(Surv(zeit, ereignis) ~ gruppe, data = df) |
der Log-Rank-Test |
| Cox-Modell |
coxph(Surv(zeit, ereignis) ~ x1 + x2, data = df) |
exp(coef) in summary() ist das Hazard Ratio |
| Proportionalität prüfen |
cox.zph(modell) |
kleiner p-Wert heisst: Der Effekt ändert sich über die Zeit |
| Nach einer Variable schichten |
coxph(Surv(...) ~ x1 + strata(x2), data = df) |
für Variablen, die die Annahme verletzen |
Multivariate Verfahren
| Hauptkomponentenanalyse |
prcomp(daten, scale. = TRUE) |
ohne scale. wird nicht standardisiert |
| Varianzanteile |
summary(pca)$importance |
drei Zeilen: Streuung, Anteil, kumuliert |
| Ladungen |
pca$rotation |
spaltenweise je Komponente, Vorzeichen beliebig |
| Komponentenwerte |
pca$x |
Varianz je Spalte gleich dem Eigenwert |
| Eigenwerte |
pca$sdev^2 |
Summe gleich der Anzahl Variablen, wenn standardisiert |
| Komponenten auf neue Daten anwenden |
predict(pca, neue_daten) |
verwendet $center und $scale des Trainings |
Zeitreihen
| Zeitreihe bilden |
ts(x, start = c(2020, 1), frequency = 12) |
frequency ist die Zahl der Zeitpunkte je Periode, 12 für Monate |
| Zerlegen |
decompose(reihe), stl(reihe, s.window = "periodic") |
decompose() hält die Saisonfigur fest, stl() lässt sie sich ändern |
| Autokorrelation |
acf(x), pacf(x) |
plot = FALSE liefert die Werte statt der Grafik |
| Differenzieren |
diff(x), diff(x, lag = 12) |
einmal gegen den Trend, mit lag gegen die Saison |
| Stationarität prüfen |
tseries::adf.test(x), tseries::kpss.test(x) |
adf.test() enthält einen Trendterm, adfuller() in Python nicht — die p-Werte weichen dadurch ab |
| Exponentielle Glättung |
forecast::hw(reihe, h = 12), HoltWinters(reihe) |
die Parameterschranken liegen bei 1e-4, statsmodels lässt exakte Nullen zu |
| ARIMA automatisch |
forecast::auto.arima(reihe) |
wählt nach AICc; die Auswahl kann von der in Python abweichen |
| ARIMA von Hand |
forecast::Arima(reihe, order = c(1,1,1), seasonal = c(0,1,1)) |
|
| Prognose |
forecast(modell, h = 12) |
mit autoplot() zeichnen |
| Residuen prüfen |
forecast::checkresiduals(modell) |
enthält den Ljung-Box-Test; die Freiheitsgrade weichen von acorr_ljungbox ab |
Grafik
| Mehrere Grafiken nebeneinander |
par(mfrow = c(1, 3)) |
danach mit par(mfrow = c(1, 1)) zurücksetzen |
| Streudiagramm |
plot(x, y, pch = 16) |
|
| Gerade eines Modells einzeichnen |
abline(modell) |
auch abline(h =), abline(v =) für Hilfslinien |
| Glättungskurve |
lines(lowess(x, y)) |
nützlich im Residuenplot, um Bögen sichtbar zu machen |
| Boxplot nach Gruppen |
boxplot(wert ~ gruppe, data = df) |
|
| ggplot2-Grundgerüst |
ggplot(df, aes(x, y)) + geom_point() |
|
Datenbanken und SQL
| Verbindung öffnen |
con <- DBI::dbConnect(RSQLite::SQLite(), "daten.sqlite") |
für PostgreSQL RPostgres::Postgres(), für MariaDB RMariaDB::MariaDB() |
| Tabellen auflisten |
DBI::dbListTables(con), dbListFields(con, "tabelle") |
|
| Abfrage |
DBI::dbGetQuery(con, "SELECT * FROM tabelle LIMIT 10") |
gibt einen Data Frame zurück |
| Abfrage mit Werten |
dbGetQuery(con, "SELECT * FROM t WHERE x > ?", params = list(5)) |
nie die Abfrage per paste0() zusammenbauen — SQL-Injection und Formatfehler |
| Schreiben ohne Ergebnis |
DBI::dbExecute(con, "DELETE FROM t WHERE x < 0") |
gibt die Zahl der betroffenen Zeilen |
| Data Frame speichern |
DBI::dbWriteTable(con, "tabelle", df, overwrite = TRUE) |
|
| Mit dplyr auf der Datenbank |
tbl(con, "tabelle") |> filter(x > 5) |> collect() |
dbplyr übersetzt nach SQL; collect() holt das Ergebnis erst am Ende |
| Übersetztes SQL ansehen |
show_query(abfrage) |
nützlich zum Lernen und Prüfen |
| Verbindung schliessen |
DBI::dbDisconnect(con) |
gehört in jedes Skript |
Reproduzierbarkeit
| Zufall festlegen |
set.seed(42) |
gilt nur innerhalb von R — dieselbe Saat ergibt in Python andere Zahlen |
| Beispieldaten sprachübergreifend |
deterministisch erzeugen statt rnorm() |
in dieser Sammlung über einen Lehmer-Generator, siehe naechste-schritte.md |
| Projektumgebung anlegen |
renv::init() |
schreibt eine renv.lock |
| Stand festhalten |
renv::snapshot() |
nach jeder Paketänderung |
| Umgebung wiederherstellen |
renv::restore() |
auf einem anderen Rechner |
| Versionen dokumentieren |
sessionInfo() |
ans Ende des Berichts |
Pfade ohne setwd() |
here::here("daten", "roh.csv") |
funktioniert unabhängig davon, von wo das Skript gestartet wird |
| Ergebnisse einfrieren |
im Quarto-Frontmatter freeze: auto |
Chunks laufen nur neu, wenn sich der Code ändert |