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.