首页 > 解决方案 > 在 sapply 中访问向量的先前值

问题描述

我希望编写sapply以下代码的一个版本。如您所见,for代码将位置处的值替换为位置 和i位置处的值的平均值。我该怎么做?i-1i+1sapply

  test <- c(1:length(x))
  if(length(which(x > mean(x) + sd(x)*3)) > 0){
    for (i in 1:length(x)) {
      if(x[i] > mean(x) + sd(x)*3){
        x[i] <- mean(x[i-1], x[i+1])
      }
      else{
        x[i] <- x[i]
      }
    }
  }
  else{
    test <- x
  }

为了生成合适的(即非正常的)测试向量,我使用rstable了包中的函数StableEstim

x <- rstable(100, alpha = 1.48, beta = 0.99, gamma = 0.27, delta = 3.36)

标签: sapply

解决方案


不确定这是否会对其他人有所帮助,但我找到了一种方法来减少我的代码的计算密集度,而无需使用sapply

spiker <- function(x){
  l <- c(which(x > mean(x) + sd(x)*3), which(x < mean(x) - sd(x)*3))
  if(length(l) > 0){
    for (i in l) {
     x[i] <- mean(x[i-1], x[i+1])
    }
    x <- x
    spiker(x)
  }
  else{
     x <<- x
  }
}

唯一的问题是如果向量中的第一个或最后一个元素x满足 3 sd 标准,则不会计算平均值。


推荐阅读