R 按季度计算每月实现值

R 按季度计算每月实现值,r,dataframe,aggregate,zoo,R,Dataframe,Aggregate,Zoo,我有个小问题。假设我有一个zoo数据集,其结构如下: df<-data.frame(r1=rnorm(25), r2=rnorm(25)) df<-zoo(df, as.Date(seq(from=as.Date("1980-01-01"), to=as.Date("1983-02-01"), by="1 month"))) 等等——也就是说,我想用截至本季度此时的本季度已实现观测值的值替换每个月的值 我曾经尝试过rollapply(对于参数为width=2的第2个月,align=

我有个小问题。假设我有一个zoo数据集,其结构如下:

df<-data.frame(r1=rnorm(25), r2=rnorm(25))
df<-zoo(df, as.Date(seq(from=as.Date("1980-01-01"), to=as.Date("1983-02-01"), by="1 month")))
等等——也就是说,我想用截至本季度此时的本季度已实现观测值的值替换每个月的值

我曾经尝试过rollapply(对于参数为width=2的第2个月,align=“right”;对于宽度为3的第3个月),但我觉得要么我无法找到最聪明的方法,要么有更好/更快的方法。。。如有任何建议,将不胜感激


谢谢,Philipp除非我错过了什么,否则有一个办法:

fac <- as.numeric(cut(as.Date(attributes(df)$index, "%Y-%m-%d"), "quarter"))
split_df <- split(df, fac)                                                       
newdf <- do.call(rbind, lapply(split_df, 
                          function(x) {
                               x$r1 <- cumsum(x$r1) / seq_along(x$r1); 
                               x$r2 <- cumsum(x$r2) / seq_along(x$r2); 
                               return(x)}))
#newdf                                  #df
#                     r1           r2   #                    r1          r2
#1980-01-01 -0.056649139 -0.816007382   #1980-01-01 -0.05664914 -0.81600738
#1980-02-01  0.008543219 -0.423027620   #1980-02-01  0.07373558 -0.03004786
#1980-03-01  0.395468481 -0.755660995   #1980-03-01  1.16931901 -1.42092775
#1980-04-01 -0.375906206 -1.011203256   #1980-04-01 -0.37590621 -1.01120326
#1980-05-01 -0.131085288 -0.876251192   #1980-05-01  0.11373563 -0.74129913
#1980-06-01  0.025572095 -0.347781855   #1980-06-01  0.33888686  0.70915682

fac也不知道这是不是最好的方法。但它是有效的!我尝试了rollapply,最后使用可变宽度参数使其工作

rollapply(df, ((month(index(df)) - 1) %% 3) + 1, mean, align="right")

正如您所知,您的
r1
r2
向量的长度仅为25,但日期的长度为38,因此
df
的最后13行是重复的。这是你的意图吗?@尼克:我错了。都应该是25岁,天才!我不得不将month(index(df))修改为as.numeric(格式(index(df),%m)),但在其他方面非常完美!
rollapply(df, ((month(index(df)) - 1) %% 3) + 1, mean, align="right")