首页 > 解决方案 > 构建配对块的索引

问题描述

给定如下矩阵:

      p1   p2
 [1,]  1 1065
 [2,]  1 1465
 [3,]  2 1464
 [4,]  3 1463
 [5,]  4 1462
 [6,] 27  438
 [7,] 29  635
 [8,] 31 1012
 [9,] 46  768
[10,] 53 1466
[11,] 63  401
[12,] 74  966
[13,] 75 1689
[14,] 86  682
[15,] 87  683
[16,] 90  612
[17,] 92 1608

如何构建一个索引来识别 p1 和 p2 中的配对运行?我可以确定第 2-5 行代表配对运行,第 14-15 行代表配对运行,而第 12-13 行虽然在 p1 中配对,但在 p2 中没有配对。如果可以通过澄清来改善这个问题,请告诉我。

样本数据:

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")))

标签: r

解决方案


像这样的东西?

m <- 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")))

m <- m[order(m[,1], m[,2]),]
blnRun <- abs(diff(m[, "p1"])) == 1 & abs(diff(m[, "p2"])) == 1
cbind(m, idxRun = cumsum(c(blnRun, FALSE) & !c(FALSE, blnRun))*(c(FALSE, blnRun) | c(blnRun, FALSE)))
#>       p1   p2 idxRun
#>  [1,]  1 1065      0
#>  [2,]  1 1465      1
#>  [3,]  2 1464      1
#>  [4,]  3 1463      1
#>  [5,]  4 1462      1
#>  [6,] 27  438      0
#>  [7,] 29  635      0
#>  [8,] 31 1012      0
#>  [9,] 46  768      0
#> [10,] 53 1466      0
#> [11,] 63  401      0
#> [12,] 74  966      0
#> [13,] 75 1689      0
#> [14,] 86  682      2
#> [15,] 87  683      2
#> [16,] 90  612      0
#> [17,] 92 1608      0

推荐阅读