【问题标题】:R: rolling/moving average split by monthR:按月划分的滚动/移动平均线
【发布时间】:2014-12-25 16:43:01
【问题描述】:

我正在尝试按月计算滚动/移动平均值。例如,使用 ggplot2 包中的经济数据,我想构建一个伴随的时间序列,它代表每个月的 3 年滚动平均值。

library(ggplot2)
df = economics
df$month =  as.POSIXlt(df$date)$mon+1

当我手动拆分月度数据时,我得到的正是我想要的:

library(zoo)
df.test = subset(df, month==1)
df.test$uempmed.ma = rollapply(df.test$unemploy,  width=3, FUN=mean, na.rm=T, 
                               fill=NA, align="right") 


  head(df.test)

         date   pce    pop psavert uempmed unemploy year month uempmed.ma
8  1968-01-31 534.7 199920     9.5     4.5     3001 1968     1         NA
20 1969-01-31 590.2 201881     6.5     4.9     2692 1969     1         NA
32 1970-01-31 635.7 204008     8.1     4.5     3453 1970     1   3048.667
44 1971-01-31 681.3 206668     9.9     6.3     4903 1971     1   3682.667
56 1972-01-31 738.4 209061     9.4     6.6     4928 1972     1   4428.000
68 1973-01-31 828.5 211120     9.5     5.2     4452 1973     1   4761.000

但是,当我尝试使用 plyr 包同时执行所有月份时......

library(plyr)
df2 = ddply(df, .(month), mutate,
            uempmed.ma = rollapply(df$uempmed,  3, FUN=mean, na.rm=T, 
                                   fill=NA, align="right") 
)

....返回以下错误:

Error: wrong result size (478), expected 40 or 1

我知道这应该很容易,但是我很难过。

最终,我希望移动平均系列(即uempmed.ma)滞后——也就是说,在计算中不包括当前年份。例如,上面 1971-01-31 的值应该是 1968-01-31、1969-01-31 和 1970-01-31 时间段的 uempmed 的平均值。

任何帮助将不胜感激。

【问题讨论】:

    标签: r ggplot2 dataframe plyr dplyr


    【解决方案1】:

    dplyr(新一代plyr)好像可以了

    library(zoo)
    library(dplyr)
    df %>%
      group_by(month) %>%
      mutate(uempmed.ma = rollapply(unemploy, width = 3, 
             FUN = mean, na.rm = TRUE, fill = NA, align = "right"))
    

    您也可以使用基本 R 非常有效地做到这一点(当然比使用 plyr 更有效)

    transform(df, uempmed.ma = ave(unemploy, month, 
                                   FUN = function(x) rollapply(x, width = 3, 
                                                     FUN = mean, na.rm = TRUE, 
                                                     fill = NA, align = "right")))
    

    或额外的解决方案:使用data.table

    library(data.table)
    setDT(df)[, uempmed.ma := rollapply(unemploy,  width = 3, 
                              FUN = mean, na.rm = TRUE, fill = NA, 
                              align = "right"), 
              by = month]
    

    【讨论】:

    • 谢谢。关于如何将系列滞后一年(即在计算中不包括当前年份)有什么好的想法吗?
    • 我不确定你的意思。这是一个新问题吗? 当年是什么意思?也许添加一些想要的输出?
    • 别忘了library(zoo)
    • @RobertKrzyzanowski,你可能是对的,虽然我刚刚从 OP 完成了它。但无论如何我都会添加
    • 也许您可以在开头添加 NA 并删除最后一个值,例如:c(NA, head(rollapply(unemploy, width = 3, FUN = mean, na.rm = TRUE, fill = NA, align = "right"), -1))
    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2023-03-12
    • 2016-05-16
    • 2018-10-21
    • 2015-01-18
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多