R语言筛选列表中存在至少5次连续非零值的数值向量
R命名数值向量列表过滤实现
你的实现思路用Filter搭配rle做连续段判定是完全可行的,修正原代码的语法、逻辑错误后,最终代码和你最初的写法风格保持一致:
# 构造最小可复现测试样例 vec1 <- c(rep(0, 10), rep(1, 4), rep(0,5), rep(-1,5)) vec2 <- c(rep(-1, 7), rep(0,99), rep(1, 6)) vec3 <- c(rep(1,2), rep(-1,2), rep(0,10), rep(-1,4), rep(0,8)) vec4 <- rep(0, 100) dummy_list <- list(vec1, vec2, vec3, vec4) names(dummy_list) <- c("first", "second", "third", "fourth") # 执行过滤:保留存在任意连续非零值长度≥5的向量 filtered_list <- Filter(function(x) { rle_result <- rle(x != 0) any(rle_result$values & rle_result$lengths >= 5) }, dummy_list)
运行后得到的filtered_list仅保留原列表中first、second两个向量,完全符合预期输出。
原尝试代码的问题说明:
- 传入
Filter的参数x是列表中的数值向量本身,不是嵌套列表,不能用$取子元素- 没有对rle结果同时做「非零段」和「段长度达标」两个维度的判断
- 不需要调用
which(),any()会直接返回是否存在符合条件的段,逻辑更简洁
内容的提问来源于stack exchange,提问作者ramen
相关产品推荐
相关产品推荐

