在此处使用rle 进行行程编码。
vec <- c(2,4,3,3,4,5,1,0,5,1)
r <- rle(vec >= 3)
r
# Run Length Encoding
# lengths: int [1:5] 1 5 2 1 1
# values : logi [1:5] FALSE TRUE FALSE TRUE FALSE
ind <- head(which(r$values), 1)
ind
# [1] 2
r$lengths[ind]
# [1] 5
### to see what those five values are ...
r$values[-ind] <- FALSE
vec[inverse.rle(r)]
# [1] 4 3 3 4 5
这使我们获得了该行中最长的长度。要将此逐行应用于帧,
set.seed(42)
df <- replicate(10, sample(0:5, 10, rep=T))
df
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 0 0 3 1 3 5 1 3 5 3
# [2,] 4 4 4 5 4 5 4 0 1 1
# [3,] 0 5 4 2 3 1 0 2 1 1
# [4,] 0 3 4 5 1 3 0 2 0 2
# [5,] 1 1 3 1 1 2 3 4 1 4
# [6,] 3 1 1 3 2 5 4 4 4 4
# [7,] 1 2 3 3 0 4 1 3 5 5
# [8,] 1 0 2 5 4 1 0 5 4 2
# [9,] 0 0 1 1 1 5 4 4 3 5
# [10,] 3 2 0 4 1 1 3 3 0 3
func <- function(x, lim = 3) {
r <- rle(x >= lim)
ind <- head(which(r$values), 1)
if (length(ind) == 1 && !anyNA(ind)) r$lengths[ind] else 0
}
apply(df, 1, func)
# [1] 1 7 2 3 1 1 2 2 5 1