当前位置 : 主页 > 手机开发 > 无线 >

R中心移动平均值(不使用包)

来源:互联网 收集:自由互联 发布时间:2021-06-10
我一直在构建一个R中心移动平均值的函数(不使用任何包),遇到了如下挑战: 如您所知,居中移动平均线包括合并“不完整部分”(即在数据点的开头和结尾)的概念.例如,考虑下面的向量
我一直在构建一个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
网友评论