首页 > 解决方案 > 用 NA/NULL 替换不需要的值

问题描述

我有一个很长的向量列表,如前所述,必须用 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 .....

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

标签: r

解决方案


我不确定是否有一种体面的方法来对其进行矢量化,所以我将采用直接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

推荐阅读