You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断矩阵列表中是否存在连续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:45:49