如何判断矩阵列表中是否存在连续3个<100的值?R代码问题排查
解决矩阵列表中连续3个小于100值的标记问题
原代码问题分析
- 逻辑判断错误:原代码里
x & lead(x,1) & lead(x, 2) < 100只对第三个元素做了<100的判断,前两个元素直接按数值转布尔值参与运算(非0为TRUE,0为FALSE),完全不符合“连续3个都小于100”的需求 - 输出不符合预期:返回的是每个元素位置的NA/1标记,而非整个矩阵是否满足条件的0/1结果
函数式解决方案
以下几种方法均采用函数式编程思路,避免手动for循环:
方法1:纯基础R实现
无需额外扩展包,通过生成滑动索引完成判断:
set.seed(24) list_of_matrices <- replicate(100, matrix(rnorm(1*51), nrow = 1), simplify = FALSE) # 定义判断单个矩阵的函数 has_consecutive_three <- function(mat) { vec <- as.vector(mat) # 生成所有连续3元素的起始位置索引 idx <- seq_len(length(vec) - 2) # 检查是否存在任意一组连续3个值都小于100 any(sapply(idx, function(i) all(vec[i:(i+2)] < 100))) } # 应用到矩阵列表,转换为1/0标记 result <- lapply(list_of_matrices, function(x) as.integer(has_consecutive_three(x)))
方法2:使用zoo包的rollapply(更简洁)
借助zoo包的滑动窗口函数快速实现:
library(zoo) result <- lapply(list_of_matrices, function(x) { vec <- as.vector(x) # 滑动窗口大小设为3,判断每个窗口内是否全小于100,再检查是否存在符合条件的窗口 as.integer(any(rollapply(vec, width = 3, FUN = function(window) all(window < 100), fill = FALSE))) })
方法3:使用slider包(现代滑动窗口工具)
slider包提供更直观的滑动窗口API:
library(slider) result <- lapply(list_of_matrices, function(x) { vec <- as.vector(x) # 滑动窗口取当前元素及前2个,判断是否全小于100,再检查是否存在符合条件的窗口 as.integer(any(slide_lgl(vec, ~all(.x < 100), .before = 2, .complete = TRUE))) })
结果说明
最终result列表中的每个元素对应原矩阵列表的一个矩阵,值为1表示该矩阵存在连续3个小于100的值,值为0则表示不存在。
内容的提问来源于stack exchange,提问作者user11057680
相关产品推荐
相关产品推荐

