我有一个值向量,我想沿着较小的幻灯片报告窗口中的平均值。
例如,对于以下值的向量:
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, 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
包 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)