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

Mit meinem kleinen R Projekt geht es weiter. Ich hatte die folgende Situation: Ich habe die Zeitpunkte mehrere Statusübergänge eines Issues in einer denormalisierten Tabelle. Dabei kommt der Status created pro Issue exakt einmal vor. Zusätzlich habe ich noch die Dauer, die ein Issue in dem jeweiligen Status war. Ich will nun die Dauer und den created Zeitpunkt behalten. Alle anderen Zeitpunkte und auch sämtliche Status benötige ich im weiteren Verlauf nicht mehr.

Die Ausgangstabelle X sieht ungefähr so aus:


      IssueID                Date  Status Duration
            A 2016-08-09T14:33:09 created        0
            A 2016-08-19T09:21:11    open   845282
            A 2016-08-19T16:01:53  closed    24042
            A 2016-08-21T16:06:12    open   172800
            A 2016-08-25T08:13:45  closed   345600
            B 2015-09-23T12:22:21 created        0
            B 2015-09-25T07:11:01    open   172800
            B 2015-10-01T14:05:28  closed   518400

Ziel ist eine Tabelle, in der Duration der einzelnen Issues aufsummiert sind und das Date von created erhalten bleibt als CreationDate. Also in etwa so:


    IssueID,CreationDate,Duration
    A,2016-08-09T14:33:09,1387724
    B,2015-09-23T12:22:21,691200

Stellt sich heraus: das ist mit R nicht trivial zu lösen, aber auch nicht unmöglich.

1. Schritt

Im ersten Schritt erstelle ich ein Subset ausschliesslich dür den Status created:


    created.datetime <- subset(X, Status == "created", select = c("IssueID", "Date"))

2. Schritt

Im zweiten Schritt wird in die Tabelle X eine neue Spalte CreationDate eingefügt mit den Werten aus der Tabelle created.datetime:


    X$CreationDate <- created.datetime[match(X$IssueID, created.datetime$IssueID), 2]

3. Schritt

Im dritten und letzten Schritt verwende ich das plyr API, um die Tabelle zu reduzieren. Das API wurde zuvor installiert und mittels library(plyr) eingebunden.

Der entsprechende Code sieht wie folgt aus:


    reduced <- ddply(X,
                     c("IssueID", "CreationDate"),
                     function(t) data.frame(Duration = sum(t$Duration))
    )

Der Übersichtlichkeit halber habe ich den Code in 3 Zeilen dargestellt.

Das Ergebnis sieht wie folgt aus:


    > reduced
      IssueID        CreationDate Duration
    1       A 2016-08-09 14:33:09  1387724
    2       B 2015-09-23 12:22:21   691200

Fazit

Ich bin immer mehr begeistert von R. In Java hätte ich für diesen 3-Zeiler sicherlich ein vielfaches an Code produziert.


Zum selber ausprobieren der Sourcecode zum download.