【问题标题】:Calculate realized monthly values by quarter按季度计算实现的每月价值
【发布时间】:2013-11-21 18:43:56
【问题描述】:

我遇到了一点 R 问题。假设我有一个结构如下的动物园数据集:

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")))

我想按以下方式(伪代码)计算 r1 和 r2 每月的季度平均值:

rx (Jan. 1980) = rx (Jan. 1980)
rx (Feb. 1980) = average [ rx (Jan. 1980), rx (Feb. 1980) ]
rx (Mar. 1980) = average [ rx (Jan. 1980), rx (Feb. 1980), rx (Mar. 1980)]

rx (Apr. 1980) = rx (Apr. 1980)
rx (May  1980) = average [ rx (Apr. 1980), rx (May  1980) ]
rx (Jun. 1980) = average [ rx (Apr. 1980), rx (May  1980), rx (Jun. 1980)]

等等。 - 也就是说,我想将每个月的值替换为该季度截至本季度这一点的已实现观察值。

我已经尝试过 rollapply(对于参数宽度 = 2 的第 2 个月,align = "right";对于宽度 = 3 的第 3 个月),但我觉得要么我想不出最聪明的方法它,或者有更好/更快的方法来做到这一点......任何建议将不胜感激!

谢谢,菲利普

【问题讨论】:

  • 只是让您知道您的r1r2 向量的长度只有25,但是您的日期长度是38,所以df 的最后13 行是重复的。这是你的意图吗?
  • @Nick:我的错。应该都是 25 obs。

标签: r dataframe aggregate zoo


【解决方案1】:

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

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

【讨论】:

  • 天才!我不得不将 month(index(df)) 修改为 as.numeric(format(index(df), "%m")) 但其他方面完美!
【解决方案2】:

除非我遗漏了什么,否则方法是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2019-10-13
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多