R查找连续符合条件数值起始位置的报错解决方案
问题解决方案
报错原因
- 循环边界溢出:你设置的循环遍历范围是向量的全部索引,当遍历到最后一个元素时,访问
i+1位置的元素会超出向量长度,得到NA值,if语句无法对NA执行布尔判断,因此抛出对应错误。 - 逻辑不匹配需求:当前代码仅判断相邻两个元素的大小,没有统计连续满足条件的元素个数,也没有校验是否达到连续3个的要求,即使修复报错也无法得到目标结果。
实现代码
循环版本(易理解)
该版本通过计数连续满足条件的元素个数,匹配到目标长度时直接返回起始位置:
find_consecutive_start <- function(distribution_input, target_length = 3, threshold = 7) { input_len <- length(distribution_input) # 输入长度不足直接返回NA if (input_len < target_length) { return(NA) } current_streak <- 0 for (i in 1:input_len) { if (distribution_input[i] > threshold) { current_streak <- current_streak + 1 # 达到连续长度要求时计算起始位置并返回 if (current_streak == target_length) { return(i - target_length + 1) } } else { # 不满足条件时重置连续计数 current_streak <- 0 } } # 没有匹配到符合要求的序列返回NA return(NA) }
测试调用:
data_frame <- c(1, 7, 8, 4, 3, 7, 8, 8, 9, 3) find_consecutive_start(data_frame) # 输出结果为7,对应连续3个大于7的序列[8,8,9]的起始位置 # 如果你需要的是大于等于7的判断条件,将代码中的> threshold改为>= threshold,返回结果为6
向量化版本(更简洁)
用base R的向量化操作实现,代码更短:
find_consecutive_start_vec <- function(distribution_input, target_length = 3, threshold = 7) { input_len <- length(distribution_input) if (input_len < target_length) return(NA) # 生成每个起始位置对应的连续序列是否满足条件的逻辑向量 match_cond <- sapply(1:(input_len - target_length + 1), function(start) { all(distribution_input[start:(start + target_length - 1)] > threshold) }) # 返回第一个匹配的位置,无匹配返回NA return(which(match_cond)[1]) }
内容的提问来源于stack exchange,提问作者John Green
相关产品推荐
相关产品推荐

