R中滑动窗口的平均值

机器算法验证 r
2022-01-30 15:35:00

我有一个值向量,我想沿着较小的幻灯片报告窗口中的平均值。

例如,对于以下值的向量:

4, 5, 7, 3, 9, 8

窗口大小为 3 和幻灯片大小为 2 将执行以下操作:

(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67

并返回这些值的向量:

5.33, 6.33, 5.67

是否有一个简单的功能可以为我做到这一点?如果它还返回窗口开始的索引,那将是一个额外的好处。在这个例子中,这将是 1,3,5

4个回答

包 zoo 中的功能rollapply让您接近:

> require(zoo)
> TS <- zoo(c(4, 5, 7, 3, 9, 8))
> rollapply(TS, width = 3, by = 2, FUN = mean, align = "left")
       1        3 
5.333333 6.333333

它只是不会为您计算最后一个值,因为它不包含 3 个观察值。也许这足以解决您的实际问题?另外,请注意,返回的对象具有您想要作为names返回向量的索引。

您的示例假设最后一个窗口中有一个未观察到的 0。NA用一个表示缺失信息并告诉mean处理缺失值的填充可能更有用或更现实。在这种情况下,我们将 (8+9)/2 作为最终的窗口值。

> TS <- zoo(c(4, 5, 7, 3, 9, 8, NA))
> rollapply(TS, width = 3, by = 2, FUN = mean, na.rm = TRUE, align = "left")
       1        3        5 
5.333333 6.333333 8.500000

Rollapply 适用于小型数据集。但是,如果您正在处理几百万行(基因组学),则速度非常慢。

以下功能超级快。

data <- c(runif(100000, min=0, max=.1),runif(100000, min=.05, max=.1),runif(10000, min=.05, max=1), runif(100000, min=0, max=.2))

slideFunct <- function(data, window, step){
  total <- length(data)
  spots <- seq(from=1, to=(total-window), by=step)
  result <- vector(length = length(spots))
  for(i in 1:length(spots)){
    result[i] <- mean(data[spots[i]:(spots[i]+window)])
  }
  return(result)
}

http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html

这行简单的代码可以做到:

((c(x,0,0) + c(0,x,0) + c(0,0,x))/3)[3:(length(x)-1)]

ifx是有问题的向量。

library(zoo)
x=c(4, 5, 7, 3, 9, 8)
rollmean(x,3)

或者

library(TTR)
x=c(4, 5, 7, 3, 9, 8)
SMA(x,3)