用NA / NULL替换不需要的值

时间:2019-08-23 15:59:16

标签: 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, NA, 64.58, NA, NA, NA, NA, NA, 67.28, 64.76,NA .....

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

1 个答案:

答案 0 :(得分:1)

我不确定是否有适当的方法可以对此进行矢量化处理,因此我将使用直接的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

对于8,000个条目,运行速度非常快;我测试了多达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