4
與此問題相關here,但爲了清晰起見,我決定再提一個問題,因爲「新」問題與原始問題沒有直接關係。簡而言之,我使用ddply累計三年中每一年的價值。我的代碼從第一年開始獲取數據,並在第二年和第三年的行中重複使用。我的猜測是每個1年的塊都被複制到整個列中,但我不明白爲什麼。R:ddply重複年度累計數據
問:我怎樣才能得到指定列的右邊每一年的累積和值?
[編輯:for循環 - 或類似的 - 很重要,因爲最終我想根據列名稱列表自動計算新列,而不是手動計算每個新列。該循環遍歷列名的列表。]
我使用ddply和cumsum組合頻繁,因此非常令人煩惱,一下子是具有與它的問題。
[編輯:此代碼已被更新,以解決我看中了,這是基於以下@大通的答案]
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
謝謝@Chase。當我處理一個小的靜態組時,我可以並且確實直接(並且成功)使用'ddply'和'transform',比如說2-3列。然後,昨天我發現我需要爲12個數據系列做這件事,這讓我得出結論,我目前對每個數值進行直接編碼的方法並沒有擴展,需要重新考慮。 'for'循環是我試圖自動完成這些每年運行總計(以及其他各種常見計算)的列的構建。 – SlowLearner
@SlowLearner - gotcha。首先想到的是將數據「融化」爲長格式,然後用'ddply'對'year'和'variable'進行分組,然後'cast'回到寬格式 – Chase
感謝您的建議。我在概念化你的意思時遇到問題。我想你的意思是垃圾的'for'循環...我試過'mydf < - 熔化(mydf,id = c('mydate','year','month')) mydf $ newcol < - 1 mydf < - ddply(mydf,。(year,variable),transform,newcol = cumsum(value)) colnames(mydf)[colnames(mydf)==「newcol」] < - paste(variable,「_cuml」,sep = 「」,collapse =「」) mydf < - cast(mydf,mydate〜variable + newcol)'這似乎工作,除非我無法完成最終的演員陣容,以使'newcol'恢復爲寬格式。你會友善地幫忙嗎? – SlowLearner