我一直在构建一个R中心移动平均值的函数(不使用任何包),遇到了如下挑战: 如您所知,居中移动平均线包括合并“不完整部分”(即在数据点的开头和结尾)的概念.例如,考虑下面的向量
如您所知,居中移动平均线包括合并“不完整部分”(即在数据点的开头和结尾)的概念.例如,考虑下面的向量p:
p <- c(10,20,30,40,50,60,70,80,90)
在这种情况下,我感兴趣的中心移动平均线看起来像这样:
x <- ((10+20)/2, (10+20+30)/3, (20+30+40)/3 ..... (70+80+90)/3, (80+90)/2)
为了实现上述目的,我尝试使用if功能如下:
wd表示窗口大小
mov_avg <- function(p, wd) {
x <- c(0, cumsum(p))
if ((p > p[1])&(p < p[length(p)])) {
neut <- 1:(length(p)-(wd-1))
upper <- neut+(wd-1)
x <- (x[upper]-x[neut])/(upper-neut)
} else if (p==p[1]) {
neut <- 0
upper <- neut+3
x <- (x[upper]-x[neut])/(upper-1-neut)
} else if (p==p[length(p)]) {
upper <-(length(p)+1)
neut <- (length(p)-(wd-2))
x <- (x[upper]-x[neut])/(upper-neut)
}
return(x)
}
然后我进入下面的行执行:
mov_avg(p, 3)
我遇到如下错误:
numeric(0)
Warning messages:
1: In if ((p > p[1]) & (p < p[length(p)])) { :
the condition has length > 1 and only the first element will be used
2: In if (p == p[1]) { :
the condition has length > 1 and only the first element will be used
有人可以帮我把它变成一个有效的功能吗?
谢谢!
另一种方法是创建一个我们可以用变量窗口调整的函数mov_avg <- function(p, window) {
mean_number = numeric()
index = 1
while(index < length(p)) {
if (index == 1 | index == length(p) - 1)
mean_number = c(mean_number, mean(p[index:(index + window - 2)]))
else
mean_number = c(mean_number, mean(p[index:(index + window - 1)]))
index = index + 1
}
mean_number
}
mov_avg(p, 3)
#[1] 15 30 40 50 60 70 80 85
mov_avg(p, 2)
#[1] 10 25 35 45 55 65 75 80
