R语言中如何检查逻辑向量内TRUE是否连续出现x次及以上
R中判定逻辑向量连续TRUE段的实现方案
输入预处理
示例中存储的"TRUE"/"FALSE"为字符串类型,需先转换为R原生逻辑值才能参与运算:logical_vec <- as.logical(c("TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE"))
核心判定逻辑
借助R内置的rle()(游程编码)函数可直接完成连续序列的特征统计,无需手动逐位计数。
全局判定:是否存在连续x次及以上的TRUE
# 设定连续长度阈值x x <- 4 # 计算向量的游程统计结果 rle_res <- rle(logical_vec) # 判定是否存在符合阈值的连续段 has_qualified_run <- any(rle_res$values == TRUE & rle_res$lengths >= x)
对示例向量执行后,has_qualified_run返回TRUE——因最后一段连续4个TRUE达到阈值,其余连续TRUE段长度分别为3、1、1,均不满足要求。
逐位标记:输出位置级的逻辑标记向量
如果需要存储每个位置的判定结果,可将rle的统计结果反向映射回原向量长度,生成逐位置标记:
marked_vec <- inverse.rle( list( lengths = rle_res$lengths, # 每个游程的判定规则:为TRUE且长度达标,则整段标记为TRUE,否则为FALSE values = rle_res$values == TRUE & rle_res$lengths >= x ) )
对示例向量,最终输出的marked_vec为:c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE)
其中,前一段连续3个TRUE未达4次阈值,整段标记为FALSE;最后一段连续4个TRUE达标,整段标记为TRUE。
分组场景适配提示
- 这套逻辑可直接嵌入现有for循环的每个分组处理流程,无需调整原有遍历结构
- 连续段判定前,必须保证每个分组内的日期已按时间顺序排序,否则会出现连续关系误判
内容的提问来源于stack exchange,提问作者learning_to_code
相关产品推荐
相关产品推荐

