在 R 中使用 data.table 的向量的简单移动平均值(部分 window)

Simple moving average (partial window) of a vector using data.table in R

我有一个简单的向量如下:

x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)

我试图找到这个向量的滚动平均值并使用以下函数:

library(data.table)
y = frollmean(x, 5)

我得到的结果如下 -

 [1]     NA     NA     NA     NA 13.334 13.086 13.150 13.856 15.400 16.340

但是,我希望结果为 -

 [1]     14.24 14.03 13.06 13.43 13.334 13.086 13.150 13.856 15.400 16.340
  1. 第一个值应与原始向量中的值相同
  2. 第二个值应该是第一个和第二个值的平均值
  3. 第三个值应该是前三个值的平均值 矢量
  4. 第四个值应该是向量中前四个值的平均值

其余计算由函数正确处理 frollmean

任何建议都会有所帮助。

谢谢!

您可以将 zoorollapplyr 函数与 partial = TRUE 一起使用。

zoo::rollapplyr(x, 5, mean, partial = TRUE)
#[1] 14.24 14.03 13.60 13.43 13.33 13.09 13.15 13.86 15.40 16.34

如果您想在 base R 武器库中包含该功能,请将其放入您的 ~/.Rprofile

rollmean <- function(vec, len, prtl = FALSE) {
  if (len > length(vec)) {
    stop(paste("Choose lower range,", len, ">", length(vec)))
  }
  else {
    if (prtl == T) {
      sapply(1:length(vec), function(i) {
        if (i <= len) {
          mean(vec[1:i])
        }
        else {
          mean(vec[(i - (len - 1)):i])
        }
      })
    }
    else {
      sapply(1:length(vec), function(i) {
        if (i - (len - 1) > 0) {
          mean(vec[(i - (len - 1)):i])
        }
        else {
          NA
        }
      })
    }
  }
}

x <- c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)

rollmean( x, 5 )
#[1]     NA     NA     NA     NA 13.334 13.086 13.150 13.856 15.400 16.340

rollmean( x, 5, T )
#[1] 14.24000 14.03000 13.60333 13.43250 13.33400 13.08600 13.15000 13.85600
#[9] 15.40000 16.34000

在您的 frollmean 函数调用中,您要求宽度为 5 的 window。无法为此 window 宽度计算所有 NA 前导元素,因为没有足够的元素。 ?frollmean 手动示例中提供了部分 window 支持。以下是根据您的案例改编的代码。

x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)
library(data.table)
an = function(n, len) c(seq.int(n), rep(n, len-n))
y = frollmean(x, an(5, length(x)), adaptive=TRUE)
y
# [1] 14.24000 14.03000 13.60333 13.43250 13.33400 13.08600 13.15000 13.85600 15.40000 16.34000

参数 adaptive 是更通用的(不仅仅是逻辑 partial)自定义 window 宽度的方法。这里我们使用辅助函数an来计算window的自适应长度。如果你只调用 an 你可以观察到 window 宽度现在正是你所期望的,而不是 5:

an(5, length(x))
# [1] 1 2 3 4 5 5 5 5 5 5