我有这个数据集: 样品:
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循环的组合来完成。但即使在努力之后我也无法弄清楚算法。我需要帮助。
感谢您的考虑。
答案 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
}
}
}
如果您要将内容设置为NA
,sd(x)
正在发生变化,所以我也将其包括在内......