R语言实现:将向量中大于等于此前任意值的元素替换为NA
R向量处理:将非严格历史最小值位置替换为NA
需求说明
对R语言向量vec逐元素做如下处理:遍历每个位置的元素,若该元素大于等于它之前出现过的任意元素(即没有产生新的严格历史最小值),则将该位置的值替换为NA。
测试用例
原始输入向量
vec = c(14.2, 3.7, 2.875, 2.175, 1.575, 1.1, 0.7, 0.475, 0.3, 0.65, 0.125, 0.925, 0.025, 0.025, 0.015, 0.020)
预期处理结果
c(14.2, 3.7, 2.875, 2.175, 1.575, 1.1, 0.7, 0.475, 0.3, NA, 0.125, NA, 0.025, NA, 0.015, NA)
实现方案与性能对比
我们选取了两种社区常见实现,做了1000次迭代的基准性能测试,测试代码如下:
microbenchmark::microbenchmark( TarJae = vec[c(which(vec >= shift(vec, n = 1L, type = "lag")))] <- NA, onyambu = replace(vec, vec > cummin(vec) | duplicated(vec), NA), times = 1000 )
测试输出结果:
expr min lq mean median uq max neval cld TarJae 41.846 44.1550 49.79315 46.2705 47.7505 2742.726 1000 b onyambu 18.066 19.4435 21.21144 20.3280 21.3395 69.071 1000 a
从测试结果可以得到明确结论:
- onyambu提出的基于
cummin(累积最小值计算)搭配duplicated(重复值判断)的方案性能显著更优,中位运行耗时仅20.3微秒左右,最大耗时不超过70微秒,运行稳定性极强 - TarJae的移位比较方案中位耗时约46.3微秒,且存在超过2.7毫秒的极端长尾耗时,性能和稳定性都弱于前者
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

