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>