根据 NA 值动态计算滚动平均值

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

我的数据看起来像这样。

df <- data.frame(
  Week = seq(1:10),
  BA.1 = c(.55, .52, .45, .39, .25, .10, 0, NA, NA, NA),
  JN.1 = c(0, 0, 0.1, 0.3, 0.56, 0.71, 0.79, NA, NA, NA), 
  other = c(0.24, 0.35, 0.32, 0.44, 0.29, 0.49, 0.23, NA, NA, NA), 
  Cases = c(22, 34, 45, 56, 79, 90, 99, 96, 93, 87)
)

df
> df
   Week BA.1 JN.1 other Cases
1     1 0.55 0.00  0.24    22
2     2 0.52 0.00  0.35    34
3     3 0.45 0.10  0.32    45
4     4 0.39 0.30  0.44    56
5     5 0.25 0.56  0.29    79
6     6 0.10 0.71  0.49    90
7     7 0.00 0.79  0.23    99
8     8   NA   NA    NA    96
9     9   NA   NA    NA    93
10   10   NA   NA    NA    87

我想动态计算 3 周滚动平均值,并将

NA
BA.1
JN.1
列中的
other
值替换为该 3 周滚动平均值。当我说动态时,我正在寻找的解决方案必须检测 NA 值(可能通过
case_when()
语句),而不是隐式知道哪些行是
NA
。我正在前瞻性地更新此数据,因此这些列中存在 NA 值的行经常发生变化。

这也意味着前一行计算的滚动平均值将用于下一行的计算。理想的输出(四舍五入 2 位小数后)将类似于此示例 df。

> output_df
   Week BA.1 JN.1 other Cases
1     1 0.55 0.00  0.24    22
2     2 0.52 0.00  0.35    34
3     3 0.45 0.10  0.32    45
4     4 0.39 0.30  0.44    56
5     5 0.25 0.56  0.29    79
6     6 0.10 0.71  0.49    90
7     7 0.00 0.79  0.23    99
8     8 0.12 0.69  0.34    96
9     9 0.07 0.73  0.35    93
10   10 0.06 0.74  0.31    87
r data-wrangling rolling-average
1个回答
0
投票

创建如图所示的功能卷,然后将其应用到所需的每个列。

library(dplyr)

roll <- function(x) {
  nr <- nrow(df)
  if (nr > 1)
    for(i in seq(2, nr)) {
      ix <- pmax(1, seq(i-3, i-1))
      if (is.na(x[i])) x[i] <- mean(x[ix], na.rm = TRUE)
    }
  round(x, 2)
}

library(dplyr)
df %>%
  mutate(across(BA.1:other, roll))

给予

   Week BA.1 JN.1 other Cases
1     1 0.55 0.00  0.24    22
2     2 0.52 0.00  0.35    34
3     3 0.45 0.10  0.32    45
4     4 0.39 0.30  0.44    56
5     5 0.25 0.56  0.29    79
6     6 0.10 0.71  0.49    90
7     7 0.00 0.79  0.23    99
8     8 0.12 0.69  0.34    96
9     9 0.07 0.73  0.35    93
10   10 0.06 0.74  0.31    87
© www.soinside.com 2019 - 2024. All rights reserved.