全年各天的滚动平均值

问题描述 投票:0回答:1

在下面的示例中,我可以计算中心 7 天滚动平均值,但是前三天和后三天是 NA 值。滚动平均值应考虑到第 365 天之后是第 1 天,并将其用于滚动平均值计算。如何计算 7 天滚动平均值以便不存在 NA 值?

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

set.seed(321)

aa <- data.frame(
  doy = seq(1,365,1),
  value = round(rnorm(365,30,5))
)

bb <- aa %>%
  mutate(movingAVG = round(rollmean(value, k = 7, align = 'center', fill = NA)))

head(bb)
#>   doy value movingAVG
#> 1   1    39        NA
#> 2   2    26        NA
#> 3   3    29        NA
#> 4   4    29        31
#> 5   5    29        30
#> 6   6    31        31

tail(bb)
#>     doy value movingAVG
#> 360 360    24        30
#> 361 361    38        29
#> 362 362    30        29
#> 363 363    20        NA
#> 364 364    26        NA
#> 365 365    29        NA

创建于 2023 年 11 月 29 日,使用 reprex v2.0.2

r dplyr mean zoo
1个回答
0
投票

一个可能的选择是向数据帧添加两个 aa(例如 1-365 + 1-365 + 1-365),计算所有值的滚动平均值,然后过滤掉原始 aa(即 1-365 + 1) -365 + 1-365),例如

library(tidyverse)
library(zoo)

set.seed(321)

aa <- data.frame(
  doy = seq(1,365,1),
  value = round(rnorm(365,30,5))
)

bb <- aa %>%
  bind_rows(aa, .id = "index") %>%
  bind_rows(aa) %>%
  mutate(movingAVG = round(rollmean(value, k = 7, align = 'center', fill = NA))) %>%
  filter(index == 2) %>%
  select(-index)

head(bb)
#>   doy value movingAVG
#> 1   1    39        28
#> 2   2    26        30
#> 3   3    29        30
#> 4   4    29        31
#> 5   5    29        30
#> 6   6    31        31
tail(bb)
#>     doy value movingAVG
#> 360 360    24        30
#> 361 361    38        29
#> 362 362    30        29
#> 363 363    20        29
#> 364 364    26        30
#> 365 365    29        28

创建于 2023-11-30,使用 reprex v2.0.2

这有道理吗?

© www.soinside.com 2019 - 2024. All rights reserved.