比较vector中的值,如果下一个值大于或等于前一个值,则将其设为NA



在下面的向量中,我想比较向量中的值,如果下一个值大于或等于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)

以下是预期的输出

vec = 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)

以下是解决方案的性能-

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所指出的,此解决方案在**10, 12, 11**

的情况下不起作用。library(dplyr) vec[c(which(vec >= lag(vec)))] <- NA

更新到更新后的问题:基本上是相同的答案:

library(dplyr)
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)
vec[c(which(vec >= lag(vec)))] <- NA
vec
[1] 14.200  3.700  2.875  2.175  1.575  1.100  0.700  0.475  0.300     NA  0.125     NA  0.025     NA  0.015     NA

我们可以使用lag然后比较两个向量,获得which的索引并将NA分配给这些索引:

library(dplyr)
vec[c(which(vec > lag(vec)))] <- NA
[1] 14.200  3.700  2.875  2.175  1.575  1.100  0.700  0.475  0.300     NA  0.125     NA

一种方法是:

replace(vec, vec > cummin(vec) | duplicated(vec), NA)
[1] 14.200  3.700  2.875  2.175  1.575  1.100  0.700  0.475  0.300     NA  0.125     NA  0.025  NA

甚至:

`is.na<-`(vec, vec > cummin(vec)|duplicated(vec))
[1] 14.200  3.700  2.875  2.175  1.575  1.100  0.700  0.475  0.300     NA  0.125     NA  0.025  NA

试试这个

ifelse(c(vec[2]-vec[1] , diff(vec)) < 0 , vec , NA)

最新更新