values <- runif(100)
# get runs where values > 0.75 (these are TRUE/FALSE)
runs <- rle(values > 0.75)
# Mask out the runs with lengths < 3
runs$values[runs$lengths < 3] <- FALSE
# Get a vector of positions that meet the run criteria
masked <- inverse.rle(runs)
masked
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
#> [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE
#> [100] FALSE
# The above gives TRUE/FALSE but can convert to TRUE/NA like the
# original solution
masked[!masked] <- NA
masked
#> [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [15] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [29] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [43] NA NA NA NA NA NA NA NA NA NA TRUE TRUE TRUE NA
#> [57] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [71] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [85] NA NA NA NA NA NA NA NA NA NA NA TRUE TRUE TRUE
#> [99] NA NA
Created on 2019-05-10 by the reprex package (v0.2.1)