清理数据集

时间:2012-05-30 20:44:26

标签: r

我有这个数据集: 样品:

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> 1,我想用NA代替x的值。 SD(x)的。它应该以最初检查x [i] -x [i + 1]的方式完成。如果这不满足下一个i的条件检查。 现在,如果条件满足,则应将NA设为x [i + 1]。

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

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

感谢您的考虑。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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)正在发生变化,所以我也将其包括在内......