R 按季度计算每月实现值
我有个小问题。假设我有一个zoo数据集,其结构如下: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=
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")