Tracks
/
R
R
/
Lehrplan
/
Vektorfunktionen
Ve

Vektorfunktionen in R

1 Übung

Über Vektorfunktionen

Das ist ein großes Konzept in R. Um die Möglichkeiten besser einordnen zu können, ist es hilfreich, die Dimensionalität der Eingabe(n) und der Ausgabe der verschiedenen Funktionen zu betrachten.

Vektor rein, Skalar raus

Wir haben bereits Funktionen gesehen, die einen Vektor entgegennehmen und einen einzelnen, skalarartigen Wert zurückgeben:

v <- 1:5
length(v)
#> [1] 5
sum(v)
#> [1] 15

Viele statistische Funktionen gehören ebenfalls in diese Kategorie, etwa mean().

Für logische Vektoren gibt es all() und any(), die einen einzelnen TRUE- oder FALSE-Wert zurückgeben.

Vektor rein, Vektor raus

Viele Funktionen in R arbeiten mit ganzen Vektoren und liefern dabei oft einen Vektor als Ausgabe. Das gilt für die meisten mathematischen Funktionen:

sq <- c(4, 9, 16, 25)
sqrt(sq) # square root
#> [1] 2 3 4 5

Das ist nicht nur knapp und praktisch, weil es Schleifen, List Comprehensions oder Rekursion überflüssig macht, die in anderen Sprachen üblich sind. In R laufen Vektorfunktionen oft viel schneller als solche Techniken.

Du hast vektorisierte Funktionen schon öfter verwendet, als dir wahrscheinlich bewusst ist. Vergleiche diese beiden:

v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1]  5  8 14
"+"(v, w)
#> [1]  5  8 14

Die vertrauten Infix-Operatoren sind nur syntaktischer Zucker für die zugrunde liegende vektorisierte Funktion! In diesem Fall "+"().

Zum Sortieren eines Vektors gibt es sort(), um die Werte zurückzugeben, und order(), um die Indizes zurückzugeben:

v <- c("I", "am", "not", "in", "order")
sort(v)
#> [1] "am"    "I"     "in"    "not"   "order"
order(v)
#> [1] 2 1 4 3 5

Standardmäßig wird aufsteigend sortiert. Gib bei Bedarf decreasing = TRUE an, oder verwende rev(), um einen vorhandenen Vektor umzukehren.

v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not"   "in"    "I"     "am"

rev(1:4)
#> [1] 4 3 2 1

Es gibt auch Funktionen wie cumsum() und cumprod(), die kumulative Vektorausgaben erzeugen und den Eingabevektor von links nach rechts verarbeiten:

cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

Die obigen Beispiele ähneln foldl-Operationen in vielen funktionalen Sprachen, nur dass die Ausgabe hier ein Vektor mit allen Zwischenwerten ist.

Mehrere Vektoren rein, Vektor raus

Eine Erweiterung dieses Konzepts lässt sich auch zum Vergleichen von Vektoren verwenden. Betrachte zum Beispiel die Funktion pmax() für das paarweise Maximum:

v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

Diese Funktion und andere ihrer Art akzeptieren auch eine beliebige Anzahl von Eingabevektoren, nicht nur zwei.

Das obige Beispiel verwendet Vektoren gleicher Länge. Wie im Konzept Vektor-Filterung besprochen, verwendet R Recycling, um Vektoren zu verlängern, die irgendwie „zu kurz“ sind. Noch einmal: Verwende das mit Vorsicht und am besten nur mit einem Vektor der Länge 1.

pmax(v, 5)
#> [1] 5 7 9

Vektor rein, Matrix raus

Das kommt seltener vor, aber es ist recht einfach, Funktionen zu schreiben, die scheinbar einen Skalar entgegennehmen und einen Vektor ausgeben. Auf einen Vektor angewendet ist die Ausgabe eine 2-D-matrix (behandelt in einem späteren Konzept).

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Vektorfunktionen