Jakob Richter

aggregate() – der Anfang

Jetzt möchte ich nur kurz die mir sehr lieb gewonnene R-Funktion aggregate() vorstellen. Wer die Funktionen sapply(), apply(), lapply() usw. schon kennt und gerne nutzt, ist vermutlich auch schon ab und zu auf das Problem gestoßen, dass man evtl. auch über mehrere Zeilen hinweg eine Funktion anwenden möchte.

Nutzfälle

Was ist z.B. wenn wir das arithmetische Mittel von immer 3 aufeinanderfolgenden Daten in einem Datensatz berechen wollen? Betrachten wir folgendes Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X <- rep(c(4,10,16),length.out=12)
Y <- runif(12)
XY <- cbind.data.frame(X,Y)
head(XY) #sollte ungefähr so aussehen
#    X          Y
# 1  4 0.05644781
# 2 10 0.58944284
# 3 16 0.35899530
# 4  4 0.07475402
# 5 10 0.75567801
# 6 16 0.94060689
jeweils <- 3
teile <- ceiling((1:nrow(XY))/jeweils)
teile
# [1] 1 1 1 2 2 2 3 3 3 4 4 4
aggregate(XY,by=list(teile),FUN=mean)
#   Group.1  X         Y
# 1       1 10 0.6196099
# 2       2 10 0.5319404
# 3       3 10 0.4377502
# 4       4 10 0.4572320
#Beachte: (4+10+16)/3=10


Wichtig dabei ist zu beachten, dass bei aggregate(by=…) eine liste stehen muss. Das mag am Anfang etwas verwirrend sein. Später werden wir aber noch zu einem Fall kommen wo klar wird, warum das so Sinn ergibt. Was sich von selbst versteht ist, dass die Datenzeilen natürlich nicht direkt untereinander stehen müssen und die Ziffern von teile nur rein symbolisch sind. Betrachten wir deshalb nochmal folgendes Beispiel:

24
25
26
27
28
29
30
31
teile2 <- rep(c("A","Q","BE"),length.out=12)
teile2
# [1] "A"  "Q"  "BE" "A"  "Q"  "BE" "A"  "Q"  "BE" "A"  "Q"  "BE"
aggregate(XY,by=list(teile2),FUN=mean)
# Group.1  X         Y
# 1       A  4 0.6745746
# 2      BE 16 0.3733288
# 3       Q 10 0.4869959

Was ist nun passiert? Der aufmerksame Beobachter wird feststellen, dass teile2 nun genau die gleiche Form hat, wie der Vektor X. Das „A“ von teile2 steht also nun immer an der gleichen Stelle wie die 4 in X. Das Gleiche mit den anderen Gruppenindikatoren. Wen das nicht verwirrt, der ist bereit für den nächsten Schritt, welcher in Bälde gepostet wird.

Teil 2 findet sich hier: aggregate() – Teil 2

Leave a Reply