データフレームの列のサブセットの各列の値に基づいて、複数の新しい列を計算してデータフレームに追加する必要があります。これらの列はすべて時系列データを保持します(共通の日付列があります)。たとえば、前年の同じ月の12列の変化を計算する必要があります。それらを指定して個別に計算することもできますが、変換する列の数が多いと面倒になるため、forループを使用してプロセスを自動化しようとしています。
ddply
これまでの年の値の現在の合計の列を作成するために使用しようとするまで、私はOKを実行していました。何が起こるかというとddply
、ループの各反復中に新しい行を追加し、それらの新しい行をcumsum
計算に含めます。2つの質問があります。
Q.正しいcumsumを計算するためにddplyを取得するにはどうすればよいですか?Q.ダミー値を使用して後で名前を変更するのではなく、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