R语言如何提取向量中高于阈值的连续子集的起止坐标
R语言提取向量中高于阈值的连续子集起止坐标方案
单行实现方案
基于R内置的游程编码函数rle(),无需依赖任何第三方包,直接运行即可得到符合要求的结果:
data.frame(left = with(rle(v >= 0.7), c(1, cumsum(lengths)[-length(lengths)] + 1)[values]), right = with(rle(v >= 0.7), cumsum(lengths)[values]))
输出结果完全匹配预期:
left right 1 1 4 2 15 23 3 26 29 4 31 32
易读版实现
如果需要后续维护调整,推荐写法更清晰的版本:
threshold <- 0.7 # 计算连续布尔序列的游程编码 run_info <- rle(v >= threshold) # 计算每个连续块的起止位置 block_end <- cumsum(run_info$lengths) block_start <- c(1, block_end[-length(block_end)] + 1) # 筛选出符合阈值条件的块 result <- data.frame( left = block_start[run_info$values], right = block_end[run_info$values] )
逻辑说明
- 核心依赖R内置的
rle()(游程编码)函数,是R语言处理连续序列问题的标准惯用方案,长向量场景下性能远高于手写循环 - 先将原向量转为布尔向量:
v >= threshold,大于等于阈值的位置标记为TRUE,反之为FALSE - 用
rle()统计连续TRUE/FALSE块的长度,再通过累计长度计算每个块的起止索引 - 最后筛选出值为
TRUE的块的起止索引即可得到结果
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

