0

我有这个数据集:示例:

x=rnorm(45)
std_d=sd(x)

现在 x 看起来像:

 [1] -0.08059702  0.90403763 -0.18618130 -0.48590834  1.23714656  1.02248570

  [7] -0.28970333 -0.19626563  0.89060697  0.87530362 

令 p=abs(x[i] - x[i+1])。如果 p> sd(x),我想用 NA 代替 x 的值。它应该以最初检查 x[i] -x[i+1] 的方式完成。如果这不满足下一个 i 的条件检查。现在如果条件满足,它应该为 x[i+1] 放置 NA。

那么下一次 p 应该是 p= x[i] - x[i+2]。它应该跳过 NA 值并保持 p (x[i]) 的第一项相同,直到条件不满足。一旦发生这种情况,第一项应该成为 NA 值旁边的项,第二项成为第一项旁边的项。

我认为这可以通过 if else 和 for 循环的组合来完成。但是即使在努力之后我也无法弄清楚算法。我需要这方面的帮助。

谢谢您的考虑。

4

2 回答 2

2
is.na(x) <- c(FALSE, abs(diff(x)) > sd(x) )
#Pass two:  Here your description could use a set.seed and a desired result.
> X1 <- x
> is.na(X1) <- c(FALSE, abs(diff(X1)) > sd(x) )
> X1
 [1]          NA -0.21797491 -1.02600445 -0.72889123 -0.62503927          NA          NA  0.15337312
 [9]          NA          NA  0.42646422 -0.29507148          NA  0.87813349  0.82158108  0.68864025
[17]  0.55391765 -0.06191171 -0.30596266 -0.38047100 -0.69470698 -0.20791728          NA          NA
[25]          NA          NA -0.40288484 -0.46665535          NA -0.08336907  0.25331851 -0.02854676
[33] -0.04287046          NA          NA          NA          NA          NA  0.12385424  0.21594157
[41]  0.37963948          NA -0.33320738 -1.01857538 -1.07179123
> X2 <- X1
> is.na(X2) <- c(FALSE, FALSE,  abs(diff(X2, lag=2)) > sd(x) )
> X2
 [1]          NA -0.21797491 -1.02600445 -0.72889123 -0.62503927          NA          NA  0.15337312
 [9]          NA          NA  0.42646422 -0.29507148          NA          NA  0.82158108  0.68864025
[17]  0.55391765 -0.06191171 -0.30596266 -0.38047100 -0.69470698 -0.20791728          NA          NA
[25]          NA          NA -0.40288484 -0.46665535          NA -0.08336907  0.25331851 -0.02854676
[33] -0.04287046          NA          NA          NA          NA          NA  0.12385424  0.21594157
[41]  0.37963948          NA -0.33320738 -1.01857538 -1.07179123
于 2012-05-30T21:51:48.277 回答
1

必须有更好的方法......但是在可怕的c风格中:

x <- c(-0.08059702, 0.90403763, -0.18618130, -0.48590834, 1.23714656, 1.02248570, 0.28970333, -0.19626563, 0.89060697, 0.87530362)

std_d <- sd(x)

for(i in seq_along(x)) {
  if(is.na(x[i])) next
  ctr <- i
  while(ctr < length(x)) {
    if(abs(x[i] - x[ctr+1]) > std_d) {
      x[ctr+1] <- NA
      ctr <- ctr + 1
      std_d <- sd(x, na.rm=TRUE)
    } else {
      break
    }
  }
}

如果您将内容设置为NA,sd(x)正在更改,因此我也将其包括在内...

于 2012-05-30T22:03:31.690 回答