R语言提取矩阵≥0.5连续区间及前后2个值的实现方法
R语言矩阵连续数值段提取实现
需求规则
- 输入为n1行n2列的数值矩阵
M,逐行扫描提取数值段 - 核心匹配逻辑:扫描到≥0.5的数值时,持续向后提取连续值,直到遇到<0.5的数值时停止当前核心段匹配
- 扩展提取规则:每个核心段需要额外包含段起始位置前2个值、段结束位置后2个值,索引超出矩阵边界时自动截断到行首/行尾
- 输出要求:每个提取到的数值段单独占一行
示例参考
测试矩阵定义
M <- rbind( c(0.10, 0.20, 0.40, 0.50, 0.49, 0.52, 0.67, 0.58, 0.77, 0.34, 0.31, 0.21, 0.87, 0.65, 0.54, 0.89, 0.78, 0.50, 0.22, 0.34), c(0.31, 0.28, 0.74, 0.87, 0.65, 0.54, 0.78, 0.45, 0.34, 0.41, 0.19, 0.12, 0.99, 0.99, 0.89, 0.78, 0.50, 0.66, 0.26, 0.14) ) M
测试矩阵打印结果
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [1,] 0.10 0.20 0.40 0.50 0.49 0.52 0.67 0.58 0.77 0.34 0.31 0.21 0.87 0.65 0.54 0.89 0.78 0.50 0.22 0.34 [2,] 0.31 0.28 0.74 0.87 0.65 0.54 0.78 0.45 0.34 0.41 0.19 0.12 0.99 0.99 0.89 0.78 0.50 0.66 0.26 0.14
期望输出
共提取4个数值段,每个段单独一行:
0.20 0.40 0.50 0.49 0.52 0.67 0.58 0.77 0.34 0.31 0.31 0.21 0.87 0.65 0.54 0.89 0.78 0.50 0.22 0.34 0.31 0.28 0.74 0.87 0.65 0.54 0.78 0.45 0.34 0.41 0.19 0.12 0.99 0.99 0.89 0.78 0.50 0.66 0.26 0.14
注:原示例期望输出第三行的0.50为笔误,对应矩阵实际值为0.45
循环判断逻辑说明
原有代码仅完成行遍历的框架定义,循环内需要补充4类判断:
- 状态标记判断:设置布尔值标记当前是否处于核心段匹配过程中,避免重复识别同一段的起点
- 段起点判断:未处于匹配状态时,若当前元素≥0.5,记录当前索引为核心段起点,标记进入匹配状态
- 段终点判断:处于匹配状态时,若当前元素<0.5,记录当前索引的前一位为核心段终点,标记退出匹配状态,同时计算包含前后2个值的最终提取范围,截断边界后提取元素存入结果
- 边界补处理:每行遍历结束后如果仍处于匹配状态(核心段延伸到行尾),直接以行尾为核心段终点计算提取范围
完整实现代码
# 初始化结果存储 result <- list() n_row <- nrow(M) n_col <- ncol(M) # 逐行遍历 for (i in 1:n_row) { row_data <- M[i, ] idx <- 1 in_seg <- FALSE core_start <- NULL # 逐元素遍历当前行 while (idx <= n_col) { if (!in_seg) { # 识别核心段起点 if (row_data[idx] >= 0.5) { core_start <- idx in_seg <- TRUE } } else { # 识别核心段终点 if (row_data[idx] < 0.5) { core_end <- idx - 1 in_seg <- FALSE # 计算最终提取范围,处理边界 ext_start <- max(1, core_start - 2) ext_end <- min(n_col, core_end + 2) result[[length(result) + 1]] <- row_data[ext_start:ext_end] } } idx <- idx + 1 } # 处理核心段延伸到行尾的情况 if (in_seg) { core_end <- n_col ext_start <- max(1, core_start - 2) ext_end <- min(n_col, core_end + 2) result[[length(result) + 1]] <- row_data[ext_start:ext_end] } } # 按格式输出结果 for (seg in result) { cat(paste(seg, collapse = " "), "\n") }
运行代码即可得到符合规则的提取结果。
内容的提问来源于stack exchange,提问作者user15708301
相关产品推荐
相关产品推荐

