Code aus der Vorlesung

Vorlesung vom 16.10.2026

Die folgenden Beispiele führen in Rechenoperationen, Funktionen, Datenstrukturen und erste deskriptive Auswertungen mit R ein.

Rechenoperationen und Logarithmen

1+1
[1] 2
1-1
[1] 0
2*3
[1] 6
8/2
[1] 4
2^3
[1] 8
2*3-5
[1] 1
2*(3-5)
[1] -4
log(x = 8, base = 2)
[1] 3
log(8,2)
[1] 3
log(2,8)
[1] 0.3333333
log(base = 2, x = 8)
[1] 3

Mit ^ wird potenziert. Bei Funktionen können Argumente entweder über ihre Position oder ausdrücklich mit ihrem Namen übergeben werden. Die ersten, zweiten und vierten log()-Aufrufe berechnen daher denselben Logarithmus; log(2,8) vertauscht dagegen die Positionen von Zahl und Basis.

Vektoren und arithmetisches Mittel

## Vektor der Bierpreise erstellen
bierpreise <- c(2.10, 2.30, 2.00, 2.20, 2.35,
                2.10, 2.25, 1.80, 2.00, 2.50,
                1.95, 2.15, 1.90, 2.30, 2.10,
                1.85, 2.20, 2.15, 1.85, 1.95)


# arithmetisches Mittel berechnen
mean(bierpreise) # Das Ergebnis sollte 2.1 sein
[1] 2.1

c() fasst mehrere Werte zu einem Vektor zusammen. mean() berechnet aus diesem Vektor das arithmetische Mittel.

Datentypen und Datenstrukturen

# Datentypen und -strukturen

## Zahlen
x <- 1
x
[1] 1
x*5
[1] 5
## Text
y <- "sehr gut"
z <- 'gut'

## logische Werte/Boolsche Werte
x>1
[1] FALSE
x>=1
[1] TRUE
## Vektor

v <- c(4,6,2,9)
v
[1] 4 6 2 9
v[3]
[1] 2
v[c(1,3)]
[1] 4 2
v[v >= 4]
[1] 4 6 9
v*2
[1]  8 12  4 18
v+2
[1]  6  8  4 11
log(v,2)
[1] 2.000000 2.584963 1.000000 3.169925
mean(v)
[1] 5.25
w <- c("sehr gut", "gut", "200€")
w
[1] "sehr gut" "gut"      "200€"    
v2 <- c(1, "sehr gut")
v2
[1] "1"        "sehr gut"

R zählt die Positionen eines Vektors ab 1. Eckige Klammern wählen Werte aus: v[3] liefert den dritten Wert, und v[c(1,3)] liefert den ersten und dritten Wert. Innerhalb der Klammern kann auch eine Bedingung stehen. v[v >= 4] behält deshalb nur die Werte, die mindestens 4 sind.

Rechenoperationen und viele Funktionen werden auf jeden Eintrag eines Vektors angewendet. Enthält ein Vektor Zahlen und Text, wie v2, werden die Zahlen in Text umgewandelt, damit alle Einträge denselben Datentyp haben.

Der Datensatz mtcars

# Data Frame (= tabellarischer Datensatz)

mtcars[2, 3]
[1] 160
mtcars[, 3]
 [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8
[13] 275.8 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1 318.0 304.0 350.0
[25] 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0
mtcars[, c(3,5)]
                     disp drat
Mazda RX4           160.0 3.90
Mazda RX4 Wag       160.0 3.90
Datsun 710          108.0 3.85
Hornet 4 Drive      258.0 3.08
Hornet Sportabout   360.0 3.15
Valiant             225.0 2.76
Duster 360          360.0 3.21
Merc 240D           146.7 3.69
Merc 230            140.8 3.92
Merc 280            167.6 3.92
Merc 280C           167.6 3.92
Merc 450SE          275.8 3.07
Merc 450SL          275.8 3.07
Merc 450SLC         275.8 3.07
Cadillac Fleetwood  472.0 2.93
Lincoln Continental 460.0 3.00
Chrysler Imperial   440.0 3.23
Fiat 128             78.7 4.08
Honda Civic          75.7 4.93
Toyota Corolla       71.1 4.22
Toyota Corona       120.1 3.70
Dodge Challenger    318.0 2.76
AMC Javelin         304.0 3.15
Camaro Z28          350.0 3.73
Pontiac Firebird    400.0 3.08
Fiat X1-9            79.0 4.08
Porsche 914-2       120.3 4.43
Lotus Europa         95.1 3.77
Ford Pantera L      351.0 4.22
Ferrari Dino        145.0 3.62
Maserati Bora       301.0 3.54
Volvo 142E          121.0 4.11
mtcars[c(1,3), ]
            mpg cyl disp  hp drat   wt  qsec vs am gear carb
Mazda RX4  21.0   6  160 110 3.90 2.62 16.46  0  1    4    4
Datsun 710 22.8   4  108  93 3.85 2.32 18.61  1  1    4    1
mtcars[mtcars$cyl > 4,]
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## durchschnittliche Anzahl Zylinder
mean(mtcars$cyl)
[1] 6.1875
anzahl_gaenge <- mtcars$gear


anzahl_gaenge * 2
 [1]  8  8  8  6  6  6  6  8  8  8  8  6  6  6  6  6  6  8  8  8  6  6  6  6  6
[26]  8 10 10 10 10 10  8

Bei einem Data Frame steht in [] vor dem Komma die Auswahl der Zeilen und nach dem Komma die Auswahl der Spalten. Leere Stellen bedeuten „alle“: mtcars[, 3] wählt also alle Zeilen der dritten Spalte. Mit mtcars[c(1,3), ] werden die erste und dritte Zeile ausgewählt.

Das Dollarzeichen greift über den Spaltennamen zu, etwa mtcars$cyl. Die Bedingung mtcars$cyl > 4 erzeugt für jede Zeile einen logischen Wert; eingesetzt in die eckigen Klammern bleiben nur die passenden Autos übrig.

Häufigkeiten und grafische Darstellungen

# Häufigkeiten der Anzahl Zylinder im mtcars-Datensatz

table(mtcars$cyl)

 4  6  8 
11  7 14 
prop.table(table(mtcars$cyl))

      4       6       8 
0.34375 0.21875 0.43750 
table(mtcars$qsec)

 14.5  14.6 15.41  15.5 15.84 16.46  16.7 16.87  16.9 17.02 17.05  17.3  17.4 
    1     1     1     1     1     1     1     1     1     2     1     1     1 
17.42  17.6 17.82 17.98    18  18.3 18.52  18.6 18.61  18.9 19.44 19.47  19.9 
    1     1     1     1     1     1     1     1     1     2     1     1     1 
   20 20.01 20.22  22.9 
    1     1     1     1 
## Stabdiagramm

plot(table(mtcars$cyl),
     xlab = "Anzahl Zylinder",
     ylab ="absolute Häufigkeit")

## Säulendiagramm auf Basis absoluter Häufigkeiten
barplot(prop.table(table(mtcars$cyl)),
        xlab = "Zylinder",
        ylab = "relative Häufigkeiten")

## Histogramm der Viertelmeilenzeiten

hist(mtcars$qsec, freq = FALSE, main = "",
     xlab = "Viertelmeilenzeit in Sekunden",
     breaks = 3)

hist(mtcars$qsec, freq = FALSE, main = "",
     xlab = "Viertelmeilenzeit in Sekunden",
     breaks = c(14,16,17,18,20,24), right = FALSE)

table() zählt die absoluten Häufigkeiten. prop.table() teilt diese durch die Gesamtzahl der Beobachtungen und liefert damit relative Häufigkeiten. xlab und ylab beschriften die Achsen; mit main = "" wird kein Diagrammtitel ausgegeben.

Bei hist() legt breaks die Klasseneinteilung fest. Eine einzelne Zahl wie breaks = 3 ist ein Wunsch nach ungefähr drei Klassen; R wählt dafür passende Klassengrenzen. Ein Vektor wie c(14,16,17,18,20,24) gibt die Grenzen dagegen exakt vor. Mit freq = FALSE zeigt die y-Achse Dichten statt absoluter Häufigkeiten. right = FALSE bedeutet, dass Klassen links geschlossen und rechts offen sind: Der Wert 16 gehört zum Beispiel zur Klasse [16, 17).

Histogramm der Bierpreise

bierpreise <- c(2.10, 2.30, 2.00, 2.20, 2.35,
                2.10, 2.25, 1.80, 2.00, 2.50,
                1.95, 2.15, 1.90, 2.30, 2.10,
                1.85, 2.20, 2.15, 1.85, 1.95)

hist(bierpreise, freq = FALSE,  breaks=3, main = "",
     right = FALSE)

Empirische Verteilungsfunktion

# Empirische Verteilungsfunktion

plot(ecdf(mtcars$qsec),
     main = "", xlab = "Viertelmeilenzeit in Sekunden")

Die empirische Verteilungsfunktion zeigt für jeden Wert auf der x-Achse den Anteil der Beobachtungen, die höchstens diesen Wert annehmen. Sie steigt daher sprunghaft an und endet bei 1 beziehungsweise 100 %.

Lagemaße und Boxplot

# Lagemaße

## arithmetisches Mittel

mean(mtcars$qsec)
[1] 17.84875
sum(mtcars$qsec)/length(mtcars$qsec)
[1] 17.84875
# Boxplot
boxplot(mtcars$qsec)

Die beiden Berechnungen des arithmetischen Mittels sind gleichwertig: mean() übernimmt die Rechnung, während sum()/length() die Summe aller Werte durch ihre Anzahl teilt. Ein Boxplot fasst die Verteilung kompakt zusammen. Die Box zeigt den Bereich zwischen erstem und drittem Quartil, die Linie darin den Median; Punkte außerhalb der Antennen weisen auf mögliche Ausreißer hin.

Daten für die Übungsaufgaben

Der folgende Block installiert ein zusätzliches Paket und lädt einen darin enthaltenen Datensatz. Er wird auf der Website absichtlich nicht ausgeführt. Für die Arbeit in RStudio können die Befehle einmalig nacheinander ausgeführt werden.

# Für die Übungsaufaben: 

install.packages("remotes")
remotes::install_github("mchlbckr/MSBStatsData")

library(MSBStatsData)

bvb_rankings

median(bvb_rankings$ranking)
table(bvb_rankings$ranking)
quantile(bvb_rankings$ranking, probs = 0.25)
Zurück nach oben