Noch so ein R Problem gelöst. Wieder mit dem plyr API.
Ich habe ein data.frame
mit den Spalten für Jahr, Monat und Laufzeit. Für jede Jahr-Monats Kombination gibt es eine unterschiedliche Anzahl von Laufzeitwerten. Die Laufzeit der Jahr-Monatskombination möchte ich nun in einem Reihenboxplot visualisiert darstellen.
year month duration 2016 6 345 2016 6 378 2016 6 501 2016 6 390 2016 6 333 2016 6 321 2016 5 401 2016 5 378 2016 5 390 2016 5 331 2016 5 345 2016 4 411 2016 4 428 2016 4 190 2016 4 231
Für den Boxplot muss ich die Daten allerdings anders organisiert haben. Die Daten für die Laufzeitwerte eines Monats müssen in jeweils einem Vector innerhalb einer Spalte gespeichert werden. Ausserdem benötige ich nicht alle Monate, sondern nur die Daten der beiden letzten Monate (5 und 6).
5 6 401 345 378 378 390 501 331 390 345 333 NA 321
Um dies zu erreichen erzeuge ich zuerst eine leere Liste:
li <- list()
Im Anschluss durchlaufe ich die Ursprungsliste in einer Schleife und weise die jeweiligen Laufzeitwerte der neuen Liste l
zu:
for (i in 5:6) { li[[i-4]] <- with(dur, dur$duration[dur$month == i]) }
Die so erzeugte Liste aus Vektoren wandel ich jetzt in einen data.frame
um:
dur.df <- ldply(li, rbind)
Das Ergebnis sieht jetzt so aus:
1 2 3 4 5 6 401 378 390 331 345 NA 345 378 501 390 333 321
MIttels des transpose Befehls t(…)
kann die Matrix so angepasst werden, dass aus den Zeilen Spalten werden:
dur.dft <- t(dur.df)
Damit kann jetzt der Boxplot mittels boxplot(dur.dft)
erzeugt werden:

Unsicherheit
Da for
Schleifen in R eher selten sind bleibt die Unsicherheit, ob die Lösung die eleganteste ist. Fürs Erste allerdings reicht es.