Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:按月份划分的滚动/移动平均线_R_Ggplot2_Dataframe_Plyr_Dplyr - Fatal编程技术网

R:按月份划分的滚动/移动平均线

R:按月份划分的滚动/移动平均线,r,ggplot2,dataframe,plyr,dplyr,R,Ggplot2,Dataframe,Plyr,Dplyr,我试图按月计算滚动/移动平均线。例如,使用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,

我试图按月计算滚动/移动平均线。例如,使用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时间段的平均值

任何帮助都将不胜感激。

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

使用base R也可以非常有效地完成这项工作(当然比使用
plyr
效率更高)


或者一个额外的解决方案:使用
data.table
package

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

非常感谢。关于如何将序列延迟一年(即计算中不包括当前年份)有什么好主意吗?我不确定你的意思。这是一个新问题吗?你说今年是什么意思?也许可以添加一些所需的输出?别忘了
库(动物园)
@RobertKrzyzanowski,你可能是对的,尽管我刚刚从OP中接管了它。但我会添加任何方法,可能您可以在开头添加
NA
并删除最后一个值,比如:
c(NA,head(rollappy(unemploy,width=3,FUN=mean,NA.rm=TRUE,fill=NA,align=“right”),-1))
library(data.table)
setDT(df)[, uempmed.ma := rollapply(unemploy,  width = 3, 
                          FUN = mean, na.rm = TRUE, fill = NA, 
                          align = "right"), 
          by = month]