1

我需要根据数据框中列子集中每列中的值计算多个新列并将其添加到数据框中。这些列都保存时间序列数据(有一个通用的日期列)。例如,我需要计算十几个列在上一年同一个月的变化。我可以指定它们并单独计算它们,但是要转换大量列会变得繁重,因此我尝试使用 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
4

1 回答 1

0

在您的循环中,由于myxts不是数据框的一部分,因此它不会ddply与其他所有内容一起在语句中拆分。将其更改为:

mydf$myxts <- xts(mydf[, newcolnames[i]], order.by = mydf$mydate)

我不知道有什么方法可以将动态生成的名称与transform.

于 2012-05-09T16:00:52.020 回答