6.21 窗口平滑

6.21.1 问题

你想要计算序列给定窗口长度的平均数。这是平滑数据的一种方式。

6.21.2 方案

假设你有一个数值向量并且想要找出第一个连续四个数、第二个连续四个数等等如此的平均数(就像用一个窗口在序列上移动,移动一次,计算一次)。

  1. # 生成有22个(0-99)以内的随机数向量
  2. set.seed(123)
  3. x <- floor(runif(22) * 100)
  4. x
  5. #> [1] 28 78 40 88 94 4 52 89 55 45 95 45 67 57 10 89 24
  6. #> [18] 4 32 95 88 69
  7. # 将向量长度取整到最接近的4的倍数
  8. newlength <- ceiling(length(x)/4) * 4
  9. newlength
  10. #> [1] 24
  11. # 给新增的数值取NA值
  12. x[newlength] <- NA
  13. x
  14. #> [1] 28 78 40 88 94 4 52 89 55 45 95 45 67 57 10 89 24
  15. #> [18] 4 32 95 88 69 NA NA
  16. # 将它转换为4行的矩阵
  17. x <- matrix(x, nrow = 4)
  18. x
  19. #> [,1] [,2] [,3] [,4] [,5] [,6]
  20. #> [1,] 28 94 55 67 24 88
  21. #> [2,] 78 4 45 57 4 69
  22. #> [3,] 40 52 95 10 32 NA
  23. #> [4,] 88 89 45 89 95 NA
  24. # 计算每一列的均值,忽略NA值
  25. colMeans(x, na.rm = TRUE)
  26. #> [1] 58.50 59.75 60.00 55.75 38.75 78.50