R 用NA/NULL替换不需要的值

R 用NA/NULL替换不需要的值,r,R,我有一个很长的向量列表,如前所述,未经验证的值必须替换为NA/NULL 65.12、64.94、64.76、64.58、64.40、64.58、64.76、64.94、64.76、67.28、64.76、64.40。。。。。。。是向量/数组,我最多有8000个值 考虑到第一个数据65.12作为当前参考值,我想用NA/NULL替换绝对差值小于0.5的连续值 一旦获得第二个数据点,它必须是新的参考点64.58,并且必须从获得的第二个点计算下一个差值,如下所示 所以输出应该是这样的: 65.12,不,

我有一个很长的向量列表,如前所述,未经验证的值必须替换为NA/NULL

65.12、64.94、64.76、64.58、64.40、64.58、64.76、64.94、64.76、67.28、64.76、64.40。。。。。。。是向量/数组,我最多有8000个值

考虑到第一个数据65.12作为当前参考值,我想用NA/NULL替换绝对差值小于0.5的连续值

一旦获得第二个数据点,它必须是新的参考点64.58,并且必须从获得的第二个点计算下一个差值,如下所示

所以输出应该是这样的:

65.12,不,不,64.58,不,不,不,不,不,67.28,64.76,不


任何想法或建议都会大有帮助。

我不确定是否有合适的方法将其矢量化,因此我将使用直接for循环解决方案。尽管从速度的角度来看,for循环在R中并不理想,但它似乎可以很好地扩展到数百万个数据点

a <- c(65.12, 64.94, 64.76, 64.58, 64.40, 64.58, 64.76, 64.94, 64.76, 67.28,64.76, 64.40)

cleanVect <- function(a){
    x <- a[1]

    b <- c()
    b[1] <- x

    for (i in 2:length(a)){
        if (abs((x - a[i])) < .5){
            b[i] <- NA
        } else {
            x <- a[i]
            b[i] <- a[i]
        }
    }
    return(b)
}
cleanVect(a)

 [1] 65.12    NA    NA 64.58    NA    NA    NA    NA    NA 67.28 64.76    NA
这对于8000个条目来说运行得相当快;我测试了多达800万台,但它仍能在大约3秒钟内运行

x1 <- round(runif(8000,55,56),2)
cleanVect(x1)

           test replications elapsed relative user.self sys.self user.child sys.child
1 cleanVect(x1)          100     0.3        1      0.28     0.02         NA        NA

您可以使用replacev1、cFALSE、absdiffv1<0.5创建条件,但条件中不能存在NA NULLvector@akrun不。不工作。一旦得到新点,我需要从新点开始计算差值。您只需检查连续值的差异值,得到的结果是65.12 NA NA NA NA 67.28 64.76 NA,这不是我想要的,不清楚新点您的解释是,我想用NA/NULL替换绝对差值小于0.5的连续值。另外,不清楚为什么应该在64.58上重置它。这与:。使用循环的解决方案,您只需稍作修改即可完成所需的操作,请告诉我是否适合YouTunks进行计时验证。