Die Funktion tapply() wendet eine Funtion f auf die Elemente eines Vektoren x an, und zwar gruppenweise. Die Gruppe wird in einem zweiten Vektor gruppe angebenen.
Beispiel: wir haben einen Vektor x mit Zahlen, und einen Vektor gruppe, in welchen die Gruppeninformation steckt. gruppe kann ein Faktor sein (muss aber nicht).
x <- c(2, 3, 4, 5, 6, 7)
gruppe <- factor(c("A", "A", "B", "B", "C", "C"))
x
## [1] 2 3 4 5 6 7
gruppe
## [1] A A B B C C
## Levels: A B C
Wenn wir eine Funktion auf jede Gruppe in gruppe anwenden wollen, können wir die Funktion tapply() benutzen. Diese hat die folgenden Argumente:
tapply(vector, index, function)
An erster Stelle kommt der Vektor, an zweiter die Gruppierungsvariable (index) und an dritter Stelle die Funktion. Wenn z.B. den Mittelwert von x für jede Gruppe berechnen wollen:
tapply(x, gruppe, mean)
## A B C
## 2.5 4.5 6.5
Wir haben für diese Probleme die group_by() Funktion des dplyr Packages benutzt. Dafür müssen die Vektoren und Gruppierungsvariable aber Teil eines Dataframes sein:
library(dplyr)
## Warning: Installed Rcpp (0.12.11) different from Rcpp used to build dplyr (0.12.10).
## Please reinstall dplyr to avoid random crashes or undefined behavior.
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
df <- data_frame(x = x, gruppe = gruppe)
df
## # A tibble: 6 x 2
## x gruppe
## <dbl> <fctr>
## 1 2 A
## 2 3 A
## 3 4 B
## 4 5 B
## 5 6 C
## 6 7 C
Das heisst, das tapply() viel allgemeiner anwendbar ist. Die Funktionen des dplyr Packages haben aber eine viel konsistentere Syntax:
df %>%
group_by(gruppe) %>%
summarise(mean = mean(x))
## # A tibble: 3 x 2
## gruppe mean
## <fctr> <dbl>
## 1 A 2.5
## 2 B 4.5
## 3 C 6.5
Das Resultat ist dasselbe.