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)の場合、xの値の代わりにNAを配置したいと思います。最初にx[i]-x [i+1]をチェックする方法で行う必要があります。これが次のiの条件チェックを満たさない場合。ここで、条件が満たされる場合、x [i+1]にNAを設定する必要があります。

次に、次回pはp = x [i]-x [i+2]になります。NA値をスキップし、条件が満たされないまでp(x [i])の最初の項を同じに保つ必要があります。これが発生すると、最初の項はNA値の隣の項になり、2番目の項は最初の項の隣の項になります。

これは、ifelseと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
    }
  }
}

に設定している場合はNAsd(x)変更されているので、それも含めました...

于 2012-05-30T22:03:31.690 に答える