我有一个很长的向量列表,必须按照描述用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 .....
任何想法或建议都会有很大帮助。
答案 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