在下面的示例中,我可以计算中心 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
一个可能的选择是向数据帧添加两个 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
这有道理吗?