我需要根据数据框中列子集中每列中的值计算多个新列并将其添加到数据框中。这些列都保存时间序列数据(有一个通用的日期列)。例如,我需要计算十几个列在上一年同一个月的变化。我可以指定它们并单独计算它们,但是要转换大量列会变得繁重,因此我尝试使用 for 循环自动化该过程。
在我尝试使用ddply
为迄今为止的年度值的运行总计创建一个列之前,我做得很好。发生的情况是ddply
在每次迭代期间通过循环添加新行并将这些新行包括在cumsum
计算中。我有两个问题。
问:如何让 ddply 计算正确的 cumsum?问:如何在 ddply 调用期间指定列的名称,而不是使用虚拟值并在之后重命名?
[编辑:我说得太早了,下面的更新代码此时不起作用,仅供参考]
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