Читать книгу R für Data Science - Hadley Wickham - Страница 62

Nützliche Erstellungsfunktionen

Оглавление

Es gibt viele Funktionen, die Sie mit mutate() einsetzen können, um neue Variablen zu erzeugen. Wichtigste Eigenschaft ist, dass die Funktion vektorisiert ist: Sie muss einen Vektor von Werten als Eingabe übernehmen und einen Vektor mit derselben Anzahl von Werten als Ausgabe zurückgeben. Wir können zwar nicht jede mögliche Funktion auflisten, die sich verwenden lässt, doch zumindest geben wir hier eine Auswahl von Funktionen an, die häufig nützlich sind:

Arithmetische Operatoren +, -, *, /, ^

Diese sind alle vektorisiert, wobei die sogenannten »Recyclingregeln« verwendet werden. Wenn ein Parameter kürzer als der andere ist, wird er automatisch auf die gleiche Länge erweitert. Dies ist vor allem nützlich, wenn eines der Argumente eine einzelne Zahl ist: air_time / 60, hours * 60 + minute und so weiter.

Arithmetische Operatoren sind ebenfalls nützlich in Verbindung mit den Aggregatfunktionen, die Sie später noch kennenlernen werden. Zum Beispiel berechnet x / sum(x) den Anteil an einer Gesamtsumme und y - mean(y) die Differenz gegenüber dem Mittelwert.

Modulo-Arithmetik (%/% und %%)

Hierbei handelt es sich um Ganzzahldivision (%/%) und Divisionsrest (%%), wobei x == y * (x %/% y) + (x %% y) ist. Die Modulo-Arithmetik ist ein praktisches Werkzeug, weil sich damit Ganzzahlen in Teile zerlegen lassen. Zum Beispiel können Sie im flights-Datenset hour und minute aus dep_time wie folgt berechnen:

transmute(flights,

dep_time,

hour = dep_time %/% 100,

minute = dep_time %% 100

)

#> # A tibble: 336,776 × 3

#> dep_time hour minute

#> <int> <dbl> <dbl>

#> 1 517 5 17

#> 2 533 5 33

#> 3 542 5 42

#> 4 544 5 44

#> 5 554 5 54

#> 6 554 5 54

#> # ... with 3.368e+05 more rows

Logarithmusfunktionen log(), log2(), log10()

Logarithmen sind eine unglaublich nützliche Transformation für den Umgang mit Daten, die sich über mehrere Größenordnungen erstrecken. Zudem lassen sich damit multiplikative Beziehungen in additive umwandeln. Auf dieses Feature kommen wir in Teil IV zurück.

Unter sonst gleichen Bedingungen empfehle ich log2(), weil sie leicht zu interpretieren ist: Eine Differenz von 1 auf der logarithmischen Skala entspricht einer Verdopplung auf der Originalskala, und eine Differenz von -1 entspricht einer Halbierung.

Offsets

Mit den Funktionen lead() und lag() verweisen Sie auf den nächsten oder vorherigen Wert in einem Vektor. Damit können Sie laufende Differenzen berechnen (zum Beispiel x - lag(x)) oder feststellen, wann sich Werte ändern (x != lag(x)). Am nützlichsten sind sie in Verbindung mit group_by(), was Sie in Kürze kennenlernen werden:

(x <- 1:10)

#> [1] 1 2 3 4 5 6 7 8 9 10

lag(x)

#> [1] NA 1 2 3 4 5 6 7 8 9

lead(x)

#> [1] 2 3 4 5 6 7 8 9 10 NA

Kumulative und gleitende Aggregate

R bietet Funktionen für laufende Summen, Produkte, Minimalwerte und Maximalwerte: cumsum(), cumprod(), cummin(), cummax(). Im Paket dplyr ist cummean() für kumulative Mittelwerte enthalten. Wenn Sie gleitende Aggregate brauchen (das heißt eine Summe, die über einem gleitenden Fenster berechnet wird), probieren Sie das Paket RcppRoll:

x

#> [1] 1 2 3 4 5 6 7 8 9 10

cumsum(x)

#> [1] 1 3 6 10 15 21 28 36 45 55

cummean(x)

#> [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5

Logische Vergleiche <, <=, >, >=, !=

Wenn Sie eine komplexe Sequenz von logischen Operationen ausführen, ist es oftmals besser, die Zwischenwerte in neuen Variablen zu speichern, damit sich überprüfen lässt, ob jeder Schritt wie erwartet funktioniert hat.

Rangfunktionen

Es gibt eine Reihe von Rangfunktionen. Beginnen sollten Sie mit min_rank(). Sie realisiert den gebräuchlichsten Typ der Rangbildung (zum Beispiel erster, zweiter, dritter, vierter). Die Standardeinstellung vergibt den kleinsten Werten die kleinsten Ränge. Mit desc(x) können Sie den größten Werten die kleinsten Ränge zuordnen:

y <- c(1, 2, 2, NA, 3, 4)

min_rank(y)

#> [1] 1 2 2 NA 4 5

min_rank(desc(y))

#> [1] 5 3 3 NA 2 1

Wenn min_rank() nicht das liefert, was Sie brauchen, sehen Sie sich die Varianten row_number(), dense_rank(), percent_rank(), cume_dist() und ntile() an. Auf den Hilfeseiten dieser Funktionen finden Sie weitere Einzelheiten:

row_number(y)

#> [1] 1 2 3 NA 4 5

dense_rank(y)

#> [1] 1 2 2 NA 3 4

percent_rank(y)

#> [1] 0.00 0.25 0.25 NA 0.75 1.00

cume_dist(y)

#> [1] 0.2 0.6 0.6 NA 0.8 1.0

R für Data Science

Подняться наверх