我需要根据数据框中列子集中每列中的值计算并向数据框添加多个新列。这些列都包含时间序列数据(有一个共同的日期列)。例如,我需要计算十几列中上一年同月的变化。我可以指定它们并单独计算它们但是由于要转换大量的列而变得繁重,所以我试图用for循环自动化该过程。
我做得很好,直到我尝试使用ddply
为目前为止的年度值的运行总计创建一列。会发生的是ddply
在循环的每次迭代期间添加新行,并在cumsum
计算中包含那些新行。我有两个问题。
Q值。我怎样才能得到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
答案 0 :(得分:0)
在你的循环中,由于myxts
不是数据框的一部分,因此它不会在ddply
语句中与其他所有内容一起分开。将其更改为:
mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)
我不知道如何使用transform
动态生成的名称。