R:ddply重复年度累积数据

R:ddply重复年度累积数据,r,plyr,R,Plyr,与这个问题相关,但为了清晰起见,我决定问另一个问题,因为“新”问题与原始问题没有直接关系。简单地说,我使用ddply对三年中的每一年的值进行累计求和。我的代码从第一年获取数据,并在列的第二和第三年行中重复。我的猜测是,每个1年的数据块都会被复制到整个专栏中,但我不明白为什么 问:如何在指定列的正确行中获得每年的累积总值 [编辑:for循环或类似的循环很重要,因为最终我希望根据列名列表自动计算新列,而不是手动计算每个新列。循环在列名列表上迭代。] 我经常使用ddply和cumsum组合,因此突然

与这个问题相关,但为了清晰起见,我决定问另一个问题,因为“新”问题与原始问题没有直接关系。简单地说,我使用ddply对三年中的每一年的值进行累计求和。我的代码从第一年获取数据,并在列的第二和第三年行中重复。我的猜测是,每个1年的数据块都会被复制到整个专栏中,但我不明白为什么

问:如何在指定列的正确行中获得每年的累积总值

[编辑: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
require(润滑油)
需要(plyr)
需要(xts)
需要(重塑)
要求(2)
种子集(12345)
#创建虚拟时间序列数据

monthsback我并没有真正遵循您的for循环,但您是否将事情过度复杂化了?您不能直接使用
转换
ddply

#Make sure it's ordered properly
mydf <- mydf[order(mydf$year, mydf$month),]

#Use ddply to calculate the cumsum by year:
ddply(mydf, "year", transform, 
      cumsum1 = cumsum(myvalue1), 
      cumsum2 = cumsum(myvalue2))
#----------
       mydate myvalue1 myvalue2 year month   cumsum1   cumsum2
1  2010-05-01 744.1808 264.4543 2010     5  744.1808  264.4543
2  2010-06-01 775.1546 238.9828 2010     6 1519.3354  503.4371
3  2010-07-01 752.1965 269.8544 2010     7 2271.5319  773.2915
....
9  2011-01-01 745.5411 218.7712 2011     1  745.5411  218.7712
10 2011-02-01 797.9474 268.1834 2011     2 1543.4884  486.9546
11 2011-03-01 606.9071 237.0104 2011     3 2150.3955  723.9650
...
21 2012-01-01 690.7456 225.9681 2012     1  690.7456  225.9681
22 2012-02-01 665.3505 232.1225 2012     2 1356.0961  458.0906
23 2012-03-01 793.0831 206.0195 2012     3 2149.1792  664.1101
#确保订购正确

mydf谢谢你@Chase。当我处理一个小的静态组(比如2-3列)时,我可以并且确实直接(成功地)使用
ddply
transform
。然后昨天我发现我需要对12个数据系列做这项工作,这让我得出结论,我目前直接编码每个值的方法无法扩展,需要重新思考。
for
循环是我尝试自动构建包含这些年度运行总数(以及各种其他常见计算)的列的过程。@SlowLearner-gotcha。首先想到的是
将数据分解成长格式,然后使用
ddply
年份和
变量进行分组,然后
转换成宽格式感谢您的建议。我在理解你的意思时遇到了问题。我猜你是指垃圾
for
循环。。。我已经尝试了
mydf@SlowLearner-请参阅我的编辑。我现在不在R航站楼,但这就是我的想法!谢谢,这确实创建了一个新的数据框,其中有两列包含原始列的累积和。我想我可以接受这个,重命名新列并将其合并到原始数据框中,所以这非常有用。当使用dcast将新列附加到原始数据帧中,而不是让它用新计算的列替换原始列时,是否有一种方法?(我已经浏览了帮助文件,但看不到任何明显的内容。)
require(reshape2)
mydf.m <- melt(mydf, measure.vars = newcolnames)
mydf.m <- ddply(mydf.m, c("year", "variable"), transform, newcol = cumsum(value))
dcast(mydate + year + month  ~ variable, data = mydf.m, value.var = "newcol")