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>