R: Verwenden von ddply in einer Schleife über Datenrahmenspalten

Ich muss mehrere neue Spalten basierend auf den Werten in jeder Spalte in einer Teilmenge von Spalten im Datenrahmen berechnen und zu einem Datenrahmen hinzufügen. Diese Spalten enthalten alle Zeitreihendaten (es gibt eine gemeinsame Datumsspalte). Zum Beispiel muss ich die Änderung für den gleichen Monat im Vorjahr für ein Dutzend Spalten berechnen. Ich könnte sie spezifizieren und einzeln berechnen, aber das wird mit einer großen Anzahl von zu transformierenden Spalten lästig, deshalb versuche ich, den Prozess mit einer for-Schleife zu automatisieren.

Ich ging es gut, bis ich versuchte zu verwendenddply um eine Spalte für die laufende Summe des Werts für das bisherige Jahr zu erstellen. Was passiert ist dasddply fügt während jeder Iteration durch die Schleife neue Zeilen hinzu und fügt diese neuen Zeilen in die Schleife eincumsum Berechnung. Ich habe zwei Fragen.

Frage: Wie kann ich ddply bekommen, um das richtige Cumsum zu berechnen? Frage: Wie kann ich den Namen der Spalte während des Dublettenaufrufs angeben, anstatt einen Dummy-Wert zu verwenden und anschließend umzubenennen?

[Edit: Ich habe zu früh gesprochen, der aktualisierte Code unten funktioniert derzeit NICHT, nur zu Ihrer Information]

<code>require(lubridate)
require(plyr)
require(xts)

set.seed(12345)
# create dummy time series data
monthsback <- 24
startdate <- as.Date(paste(year(now()),month(now()),"1",sep = "-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "month", length.out = monthsback),
                   myvalue1 = runif(monthsback, min = 600, max = 800),
                   myvalue2 = runif(monthsback, min = 200, max = 300))

mydf$year <- as.numeric(format(as.Date(mydf$mydate), format="%Y"))
mydf$month <- as.numeric(format(as.Date(mydf$mydate), format="%m"))
newcolnames <- c('myvalue1','myvalue2')

for (i in seq_along(newcolnames)) {
    print(newcolnames[i])
    mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)
    ## Calculate change over same month in previous year
    mylag <- 12
    mydf[, paste(newcolnames[i], "_yoy", sep = "", collapse = "")] <- as.numeric(diff(mydf$myxts, lag = mylag)/ lag(mydf$myxts, mylag))
    ## Calculate change over previous month
    mylag <- 1
    mydf[, paste(newcolnames[i], "_mom", sep = "", collapse = "")] <- as.numeric(diff(mydf$myxts, lag = mylag)/ lag(mydf$myxts, mylag))

    ## Calculate cumulative figure
    #mydf$newcol <- as.numeric(mydf$myxts)
    mydf$newcol <- 1
    mydf <- ddply(mydf, .(year), transform, newcol = cumsum(as.numeric(mydf$myxts)))
    colnames(mydf)[colnames(mydf)=="newcol"] <- paste(newcolnames[i], "_cuml", sep = "", collapse = "")

}

mydf
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage