如何构建索引识别矩阵p1、p2列的配对连续运行块
R语言识别双列配对连续块实现方案
根据你给出的样例匹配结果,我们明确配对连续块的判定逻辑为:相邻两行的p1列差值绝对值为1,且p2列差值绝对值也为1,连续满足该条件的相邻行组合即为符合要求的配对连续运行块。
完整实现代码
1. 构造示例矩阵
mat <- structure(c(1L, 1L, 2L, 3L, 4L, 27L, 29L, 31L, 46L, 53L, 63L, 74L, 75L, 86L, 87L, 90L, 92L, 1065L, 1465L, 1464L, 1463L, 1462L, 438L, 635L, 1012L, 768L, 1466L, 401L, 966L, 1689L, 682L, 683L, 612L, 1608L), .Dim = c(17L, 2L), .Dimnames = list(NULL, c("p1", "p2")))
2. 核心识别逻辑
# 计算相邻行两列的差值绝对值 diff_p1 <- abs(diff(mat[, "p1"])) diff_p2 <- abs(diff(mat[, "p2"])) # 标记相邻行是否满足配对连续条件 match_flag <- diff_p1 == 1 & diff_p2 == 1 # 为连续匹配的块分配唯一ID,标记不匹配的行为无效值 block_id <- cumsum(c(FALSE, !match_flag)) block_id[!c(FALSE, match_flag)] <- NA # 筛选出所有长度>=2的有效连续块行号范围 result <- split(seq_len(nrow(mat)), block_id) result <- result[sapply(result, length) >= 2]
输出结果
运行上述代码后打印result即可得到匹配结果:
result # $`1` # [1] 2 3 4 5 # # $`4` # [1] 14 15
完全符合你要求的第2-5行、第14-15行的识别需求,同时自动排除了仅p1连续的第12-13行。
如果需要限定两列的增减方向(比如要求p1递增时p2必须递减),只需要修改match_flag的判定逻辑,去掉绝对值后匹配指定差值即可。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

