Gabi und Sascha
Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

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.


CSV Datei und Code zum selber ausprobieren.