我一直在构建一个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