ここでこの質問に関連していますが、「新しい」質問は元の質問に直接関連していないため、わかりやすくするために別の質問をすることにしました。簡単に言うと、私はddplyを使用して、3年ごとの値を累積的に合計しています。私のコードは1年目のデータを取得し、列の2年目と3年目の行で繰り返します。私の推測では、1年ごとのチャンクが列全体にコピーされていると思いますが、その理由はわかりません。
Q.指定された列の右側の行で、各年の累積合計値を取得するにはどうすればよいですか?
[編集:forループ(または同様のもの)は重要です。最終的には、新しい各列を手動で計算するのではなく、列名のリストに基づいて新しい列を自動的に計算したいからです。ループは列名のリストを繰り返し処理します。]
私はddplyとcumsumの組み合わせを頻繁に使用するので、突然問題が発生するのはかなり厄介です。
[編集:このコードは、私が解決したソリューションに更新されました。これは、以下の@Chaseの回答に基づいています]
require(lubridate)
require(plyr)
require(xts)
require(reshape)
require(reshape2)
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 = 1900, max = 2400),
myvalue3 = runif(monthsback, min = 50, max = 80),
myvalue4 = 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"))
# Select columns to process
newcolnames <- c('myvalue1','myvalue4','myvalue2')
# melt n' cast
mydf.m <- mydf[,c('mydate','year',newcolnames)]
mydf.m <- melt(mydf.m, measure.vars = newcolnames)
mydf.m <- ddply(mydf.m, c("year", "variable"), transform, newcol = cumsum(value))
mydf.m <- dcast(mydate ~ variable, data = mydf.m, value.var = "newcol")
colnames(mydf.m) <- c('mydate',paste(newcolnames, "_cum", sep = ""))
mydf <- merge(mydf, mydf.m, by = 'mydate', all = FALSE)
mydf