Aggregationen mehrer Variablen in R

Viele Variablen mit gleichen Namensprefixen aggregieren

Es ist immer sinnvoll, sich über die Nomenklatur von Variablennamen Gedanken zu machen. Die Variablen eines Data Frames nach dem Einlesen in R nochmal umzubenennen kann langfristig Arbeit ersparen. Hier ein Beispiel: die Aggregation von Tagesdaten auf Wochendaten in mehreren Variablen gleichzeitig.

Ein Data Frame hat viele Variablen, die nach einem vorgegebenen Schema benannt wurden:

  • Variablen mit zählbaren Mengen erhalten das Prefix qty. .
  • Variablen mit Beträgen erhalten das Prefix amt. .
  • Variablen mit Zustandsinformationen erhalten das Prefix is. .

Wird diese Nomenklatur konsequent angewandt, lassen sich nun Vektoren mit den Namen der jeweiligen Variablen im Data Frame erzeugen. Im R-Data Frame dydf liegen die Daten auf Tagesbasis vor. Ein grep("qty\\.") ermittelt nun alle Variablennamen, die mit dem Prefix qty. beginnen.

## Vektoren mit den Namen aller Variablen
dydf.qty.nm <- names(dydf)[grep("qty\\.", names(dydf))]
dydf.is.nm <- names(dydf)[grep("is\\.", names(dydf))]
dydf.amt.nm <- names(dydf)[grep("amt\\.", names(dydf))]

Datumsaggregationen

Damit Tagesdaten auf ein anderes Level aggregiert werden können, sollten im Data Frame zunächst neue Variablen erzeugt werden, in denen die jeweilige Zeitinformation vorhanden ist. Ein einfacher Fall ist diesbezüglich die Extraktion der Jahreszahl aus den Tagesdaten:

jahr = factor(format(dailydate, "%Y"))

Interessant ist die Extraktion der Kalenderwoche. Die Kalenderwoche wird international unterschiedlich verwendet und liegt daher in verschiedenen Formen vor. Dabei wird die erste Woche eines Jahres jeweils unterschiedlich behandelt. In R stehen die Formate U, V und W zur Verfügung.

  • U formatiert die Kalenderwochen nach US Konvention und verwendet den Sonntag als ersten Tag der Woche. Die Woche mit dem ersten Sonntag im Jahr ist somit Woche 1 des Jahres.
  • V folgt der ISO 8601 Definition und erzeugt gleichbleibend 52 Kalenderwochen pro Jahr.
  • W entspricht der UK/Europäischen Konvention mit Montag als erstem Wochentag.
woche = factor(format(dailydate, "%W"))
v.woche = factor(format(dailydate, "%V")),
kw = factor(format(dailydate, "%W%y"),
        levels = format(seq(min(dailydate, na.rm = T), max(dailydate, na.rm = T), "week"),
            "%W%y"))

Die Formatierung ab Zeile 3 im vorangehenden Codeschnipsel erzeugt eine kategoriale Variable mit der Kalenderwoche und der Jahreszahl in einem gemeinsamen String. Damit die Kategorien unzweifelhaft innerhalb der Factor Variablen korrekt sortiert werden, ist die Level Option mit angegeben.

Die aggregate Funktion in R

Nun ist es einfach, die gewünschten Variablen zu aggregieren. Dazu werden die Vektoren mit den Namen der jeweiligen Variablen verwendet.

## Aggregation auf Basis der V-Wochen (immer exact 52 Wochen, Formatierer %V)
agg.week.qty <- aggregate(dydf[, dydf.qty.nm],
                          by = list(KW = dydf$v.woche,
                          Jahr = dydf$jahr), FUN = function(x){sum(x, na.rm = T)})

## Aggregation der IS Variablen
agg.week.is <- aggregate(dydf[, dydf.is.nm],
                         by = list(KW = dydf$v.woche,
                         Jahr = dydf$jahr), FUN = function(x){max(as.numeric(x), na.rm = T)})

## Aggregation der AMT Variablen
agg.week.amt <- aggregate(dydf[, dydf.amt.nm],
                         by = list(KW = dydf$v.woche,
                         Jahr = dydf$jahr), FUN = function(x){max(as.numeric(x), na.rm = T)})

In den Ergebnisvektoren sind nun die jeweiligen Ausgangsvariablen alle nach Woche und Jahr aggregiert worden. Als Aggregationsfunktion kann eine beliebige Funktion übergeben werden. Die Namen der ursprünglich tagesbasierten Variablen bleiben dabei erhalten. Daher ist es sinnvoll, zunächst eigene Ergebnisvektoren zu erzeugen, bevor daraus ggf. ein neuer Data Frame gebildet wird.

 

Schreibe einen Kommentar