R: использование ddply в цикле по столбцам фрейма данных

Мне нужно рассчитать и добавить к фрейму данных несколько новых столбцов на основе значений в каждом столбце в подмножестве столбцов в фрейме данных. Все эти столбцы содержат данные временных рядов (есть общий столбец дат). Например, мне нужно рассчитать изменение за тот же месяц предыдущего года для десятка столбцов. Я мог бы указать их и рассчитать их индивидуально, но это становится обременительным из-за большого количества столбцов для преобразования, поэтому я пытаюсь автоматизировать процесс с помощью цикла for.

Я делал хорошо, пока я не попытался использоватьddply создать столбец для промежуточного итогового значения за год. Что происходит тоddply добавляет новые строки во время каждой итерации цикла и включает эти новые строки вcumsum расчет. У меня два вопроса.

Q. Как я могу получить ddply для вычисления правильной суммы? Как я могу указать имя столбца во время вызова ddply, а не использовать фиктивное значение и переименовать его позже?

[Редактировать: я говорил слишком рано, обновленный код ниже не работает на данный момент, только к вашему сведению]

<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>

Ответы на вопрос(1)

Ваш ответ на вопрос