r - 如何计算 R 中的 3 个月移动平均值并为 Months 创建列名?
问题描述
我有一个数据框 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 …
我想计算 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))
但是我没有得到我所期望的。
例如,我希望我的最终数据框是这样的。
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
如何创建一个需要 3 个月滚动平均值的“月”列。
您的帮助将不胜感激
解决方案
尝试这样的事情:
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
由reprex 包(v0.3.0)于 2020 年 2 月 13 日创建
推荐阅读
- regex - Jmeter 更好的方法来遍历数组列表,而不是每个值只调用 JSON 响应中的缺失值
- javascript - 在嵌套数组中查找具有值的对象并添加属性
- dt - plotly图表和DT表的客户端链接
- sql-server - SQL server - 当只有 5 列匹配时查找重复记录
- mysql - MySQL Server 8.0 - 没有 bin 文件
- reactjs - React useEffect 不重新渲染功能组件
- plotly - JavaScript 配置,在“悬停时显示最接近的数据”和“悬停时比较数据”之间进行更改
- c# - 函数不计算某些数字的二进制间隙
- java - 通过高级客户端写入弹性搜索 - 在文档上设置时间戳
- regex - Oracle通过正则表达式选择所有匹配的事件到一行中的一列,并带有分隔符