4  Rechnen mit R

R funktioniert unter anderem wie ein mächtiger Taschenrechner. Folgende grundlegende mathematische Operationen können mit R ausgeführt werden:

Operation Symbol
Addition +
Subtraktion -
Multiplikation *
Division /
Potenzieren ^ oder **
Wurzel sqrt(x)


Hier ein paar Beispiele:

# Addition 
2+8
## [1] 10
# Subtraktion 
9-7
## [1] 2
# Multiplikation 
4*4
## [1] 16
# Division 
6/2
## [1] 3
# Potenzieren 
2^3
## [1] 8
# Exponent anders notiert 
2**3
## [1] 8
# Quadratwurzel 
sqrt(25)
## [1] 5

Vielleicht haben Sie sich schon gefragt, wieso vor jeder Ausgabe die Zeichenkette ## [1] steht. Die Rauten ## sehen Sie in Ihrer R Konsole nicht. Sie wurden von quarto (siehe Kapitel 23) für diese Webseitenversion des Buches erzeugt um anzugeben, dass es sich um eine R-Ausgabe handelt, und nicht um R-Befehle. So kann auch nichts schief gehen, falls Sie Code-Chunks von dieser Seite markieren, kopieren und in Ihre Scriptdatei übertragen, denn dort kommentieren die ## die Zeile aus, so dass sie nicht ausgeführt werden.

Die [1] erklärt sich folgendermaßen. In R beginnt jede Ausgabezeile mit der Position des Wertes, der als nächstes ausgegeben wird. Da wir derzeit nur Rechenoperationen durchführen, die genau ein Ergebnis haben, ist die Position unseres Ergebniswertes immer [1]. Hat man längere Datenreihen, z.B. das Gewicht von 10 Probanden in kg, dann könnte die Ausgabe so aussehen:

## [1] 102.20  76.83  98.50  86.55  121.93
## [6]  89.21 123.22  78.23  98.33   83.37

Die zweite Ausgabezeile beginnt mit einer [6], was bedeutet, dass nachfolgend die 6. Position der Wertereihe angezeigt wird.

Das Ziehen einer Wurzel erfolgt über die Funktion sqrt(). Damit Funktionen arbeiten können, benötigen sie ein “Argument”. Das Argument ist in unserem Fall die Zahl 25, da wir die Wurzel aus 25 ziehen wollen.

# Wurzel ziehen 
sqrt(25)
## [1] 5

Argumente werden der Funktion in runden Klammern übergeben. So erklärt sich der Befehl sqrt(25).

# Lange Formel 
sqrt( (2*10) / (20/2) ) - 9
## [1] -7.585786
# Befehl schlägt fehl!
2,3 - 9
## Error: <text>:2:2: Unerwartete(s) ','
## 1: # Befehl schlägt fehl!
## 2: 2,
##     ^

An der letzten Ausgabe zeigt sich ein wesentliches Merkmal von R:

Dezimalstellen werden mit einem Punkt UND NICHT mit einem Komma dargestellt!

Dies ist ein häufiger Anfängerfehler und meist der Grund, warum am Anfang etwas nicht funktioniert.

# Dezimalstellen mit . 
4.25 * 6.25
## [1] 26.5625
# nicht mit Komma!
# schlägt fehl
4,25 * 6,78 
## Error: <text>:3:2: Unerwartete(s) ','
## 2: # schlägt fehl
## 3: 4,
##     ^

Weitere mathematische Funktionen sind:

Funktion Befehl Beispiel Ausgabe
Exponentialfunktion exp() exp(2) [1] 7.389056
natürlicher Logarithmus log() log(2) [1] 0.6931472
Logarithmus zur Basis 2 log2() log2(3) [1] 1.584963
Logarithmus zur Basis 10 log10() log10(3) [1] 0.4771213
Sinus sin() sin(2) [1] 0.9092974
Kosinus cos() cos(2) [1] -0.4161468
Tangens tan() tan(2) [1] -2.18504
Absolutwert abs() abs(-7) [1] 7

4.1 Nachkommastellen

R zeigt standardmäßig 6 Nachkommastellen an. Intern rechnet R mit “doppelter Genauigkeit”. Damit sind Nummern mit ca. 17 Stellen (1 Ziffer + 16 Nachkommastellen oder eben eine 17 stellige Zahl ohne Nachkommastellen) repräsentierbar. Möchte man die Nachkommastellen entsprechend angezeigt bekommen, so kann man dies mit der options-Funktion einstellen:

# gib ab jetzt 16 Nachkommastellen aus 
options(digits=17)
# Wurzel aus 3 
sqrt(3)
## [1] 1.7320508075688772

Nach dieser Eingabe liefert R Ergebnisse mit bis zu 16 Nachkommastellen.

Wir stellen den Wert wieder zurück auf 6 Nachkommastellen.

# gib ab jetzt wieder "nur" 6 Nachkommastellen aus
options(digits=7)

4.2 Runden

Ziehen wir die Wurzel aus 3, erhalten wir ein Ergebnis mit 6 Nachkommastellen.

# Wurzel aus 3 
sqrt(3)
## [1] 1.732051

Dieses Ergebnis kann mit der Funktion round() gerundet werden.

# Runde auf 2 Nachkommastellen 
round(sqrt(3), digits=2)
## [1] 1.73
# Runde auf ganze Zahl 
round(sqrt(3))
## [1] 2

Bitte beachten Sie, dass R mathematisch rundet (gemäß dem IEEE 754 Standard), und nicht kaufmännisch. Beim mathematischen Runden wird eine \(5\) am Ende immer auf die nächste gerade Zahl gerundet.

Dies soll folgendes Beispiel verdeutlichen:

# mathematisches Runden
round(3.5) # ergibt 4
## [1] 4
round(2.5) # ergibt 2
## [1] 2

Neben round() existieren noch die Spezialfunktionen ceiling() und floor(). Die Funktion ceiling() rundet immer zur nächsten ganzen Zahl auf, und die Funktion floor() rundet immer zur nächsten ganzen Zahl ab. Man kann sich das so vorstellen:

  • Sie pflücken Äpfel und legen diese in Körbe. So erhalten Sie 10 volle und einen halbvollen Korb, oder andersgesagt 10,5 Körbe. Leider können Sie nur volle Körbe verkaufen. In diesem Fall würden Sie mittels floor() auf die ganze Zahl abrunden, um zu ermitteln, wieviele Körbe Sie verkaufen können.
  • Aus den restlichen Äpfeln pressen Sie Saft, den Sie in Flaschen füllen. In jede Flasche passen 100ml, und Sie pressen insgesamt 565ml Saft aus den Äpfeln. Um zu ermitteln, wieviele Flaschen Sie benötigen, runden Sie mittels ceiling() auf die nächste Zahl auf, damit nach 5 vollen Flaschen auch die restlichen 65ml aufgefangen werden können (auch wenn die letzte Flasche nicht voll wird).
# ceiling rundet immer auf 
ceiling(sqrt(3))
## [1] 2
# ceiling rundet immer auf 
ceiling(1.0008)
## [1] 2
# floor rundet immer ab 
floor(sqrt(3))
## [1] 1
# floor rundet immer ab 
floor(1.9999)
## [1] 1

R nutzt die wissenschaftliche Schreibweise sehr großer und kleiner Zahlen (so genannte Zehnerpotenzen).

# erzeuge eine sehr große Zahl
987654321 * 987654321
## [1] 9.754611e+17

Um die Ergebniszahl vor der Zehnerpotenz zu runden, kann die Funktion format() genutzt werden.

# runde vor der Zehnerpotenz
format(987654321 * 987654321, digits=2)
## [1] "9.8e+17"