简体   繁体   English

如何计算 R 中的 3 个月移动平均值并为月份创建列名?

[英]How to calculate 3 month moving mean in R and create a column name for Months?

I have a dataframe df我有一个数据框 df

str(df)

'data.frame':   396 obs. of  23 variables:
 $ Year         : chr  "1986" "1986" "1986" "1986" ...
 $ Month        : chr  "Jan" "Feb" "Mar" "Apr" ...
 $ Season       : Factor w/ 4 levels "Monsoon","PostMonsoon",..: 4 4 3 3 3 1 1 1 2 2 ...
 $ stn1         : num  2.3 42.3 91.1 267.4 482.1 ...
 $ stn2         : num  0 9 23.8 61.7 68.3 ...
 $ stn3         : num  0 10 34.6 52.5 122 …

I want to calculate the 3 month rolling mean and I tried the following code我想计算 3 个月的滚动平均值,我尝试了以下代码

library(zoo)

Roll_mean <- function(x){rollmean(x,3)} #creating a function to calculate 3 month rolling mean

monthroll_mean <- df[-2] %>% group_by(Year, Season) %>% summarise_all(list(Roll_mean))

However I do not get what I expect.但是,我没有得到我所期望的。

For instance, I want my final dataframe to be like this.例如,我希望我的最终数据框是这样的。

head(monthroll_mean)

Year  Months   stn1   stn2    stn3 
  <chr> <fct>   <dbl>    <dbl>  <dbl>  
1 1986  DJF      32.0    10.0    10       
2 1986  JFM    1157.    141.    282.       
3 1986  FMA    280.     51.3    69.7      
4 1986  MAM     352.     78.5   121.        
5 1986  AMJ      27.3     4.47   20.5        
6 1986  MJJ    1005.    139.    235        

How can I create a "Months" column which takes 3 months rolling mean.如何创建一个需要 3 个月滚动平均值的“月”列。

Your help would be appreciated您的帮助将不胜感激

Try something like this:尝试这样的事情:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df <- expand.grid(year=1991:1995,
                  month=month.abb) %>% 
  arrange(year,month) %>% 
  mutate(var1=runif(nrow(.),10,20),var2=runif(nrow(.),10,20))
head(df,10) #dummy data
#>    year month     var1     var2
#> 1  1991   Jan 13.19097 12.44519
#> 2  1991   Feb 17.02439 10.55053
#> 3  1991   Mar 11.21088 17.08536
#> 4  1991   Apr 19.73014 17.60298
#> 5  1991   May 12.72299 12.95819
#> 6  1991   Jun 17.19959 19.90314
#> 7  1991   Jul 11.47601 17.77892
#> 8  1991   Aug 10.43157 14.51260
#> 9  1991   Sep 13.66881 14.34805
#> 10 1991   Oct 13.50884 11.62024


library(zoo)
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date, as.Date.numeric

rolldf <-  df %>% 
  mutate(months=rollapply(month,3,function(x){
    paste(substr(x,1,1),collapse = '')
  },align='right',fill=NA)) %>% 
  mutate_at(vars(var1,var2),~rollmean(.,k=3,align = 'right',fill=NA))

head(rolldf)
#>   year month     var1     var2 months
#> 1 1991   Jan       NA       NA   <NA>
#> 2 1991   Feb       NA       NA   <NA>
#> 3 1991   Mar 13.80875 13.36036    JFM
#> 4 1991   Apr 15.98847 15.07962    FMA
#> 5 1991   May 14.55467 15.88217    MAM
#> 6 1991   Jun 16.55091 16.82144    AMJ

Created on 2020-02-13 by the reprex package (v0.3.0)reprex 包(v0.3.0) 于 2020 年 2 月 13 日创建

You can try :你可以试试 :

library(dplyr)
df %>% 
  group_by(Year, Season) %>% 
  mutate_at(vars(starts_with('stn')), zoo::rollapplyr, 3, fill = NA)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM