定位停止/对角线矩阵模式

时间:2013-09-23 02:32:12

标签: r

我有一个二进制编码矩阵(0/1)矩阵,如下所示:

   X1 X2 X3 X4
1   1  0  0  1
2   0  0  0  0
3   0  0  0  0
4   1  1  1  0
5   1  1  0  0
6   0  0  1  0
7   1  0  1  0
8   0  0  1  0
9   0  0  1  0
10  0  0  0  0
11  1  1  0  0
12  0  0  0  1
13  0  0  0  1
14  0  0  0  1
15  0  0  0  0
16  0  1  1  0
17  1  1  0  0
18  1  0  1  0
19  1  0  1  0
20  1  1  1  1

我正在寻找一种我可以直观地确定并描述但无法通过编程搜索来找到该模式的模式。这是模式:

我想找到停止的数字1的运行结束,并在下一行中通过不同的列拾取(如果列恰好并排,则为对角开关)。如果另一列保持1s的运行,则对角线开关不计算。

所以在上面的矩阵中,对角线切换发生在x [5,2]到x [6,3],再次发生在x [11,1(或2)]到x [12,4]

x <- structure(list(X1 = c(1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 
    0, 0, 0, 1, 1, 1, 1), X2 = c(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 1, 1, 0, 0, 1), X3 = c(0, 0, 0, 1, 0, 1, 1, 1, 1, 
    0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1), X4 = c(1L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L)), .Names = c("X1", 
    "X2", "X3", "X4"), row.names = c(NA, -20L), class = "data.frame")

这是一个难以描述的问题,但我想我已经用这个例子来说明它。期望的输出将是c(5, 11),因为当1具有此模式时,这些是行。

我怀疑rlecumsum可能会在这里使用。

修改要为问题添加信息。我尝试了Ricardo在不同矩阵上的初始解决方案:

   X1 X2 X3 X4 X5
1   0  0  1  0  0
2   1  1  0  0  1
3   0  0  0  0  0
4   0  0  1  0  0
5   0  1  1  0  0
6   1  0  1  1  0
7   1  1  0  0  0
8   0  0  1  1  1
9   0  0  1  0  0
10  1  1  0  1  0

rowdiffs <- apply(D, 2, diff)

N  <- rowSums(rowdiffs==-1)
P  <- rowSums(rowdiffs==1)

which(N - P > 0 &  P > 0)

它给出了:

## 7 
## 6 

我希望c(1, 7, 9)可以在此处跟踪的行中看到。在每个红点我都别无选择,只能走对角线(这些是蓝色路径)。如果我到达所有0的行(黄色框),我跳过该行并从下一行的路径(路径是橙色)开始(并且没有记录对角线模式)

enter image description here

D <- structure(list(X1 = c(0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L), 
        X2 = c(0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 1L), X3 = c(1L, 
        0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L), X4 = c(0L, 0L, 0L, 0L, 
        0L, 1L, 0L, 1L, 0L, 1L), X5 = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 
        1L, 0L, 0L)), .Names = c("X1", "X2", "X3", "X4", "X5"), row.names = c(NA, 
    10L), class = "data.frame")

2 个答案:

答案 0 :(得分:3)

尝试以下方法:

rowdiffs <- rbind(apply(D, 2, diff), NA)

N  <- rowSums(rowdiffs==-1)
P  <- rowSums(rowdiffs==1)

candidates <- which(N &  P)
falseCandidates <- which(rowSums(rowdiffs==0 & D==1) >= 1)

setdiff(candidates, falseCandidates)
#  [1] 1 7 9

说明:

将每一行与下面的一行(rowdiffs)进行比较 候选行将具有以下属性:

* contain both a `-1` and `+1` in the diffs 
      (indicating the diagonal move)
* NOT contain a `0` in the diffs where there is a `1` in the original data
      (indicating potential lateral move (or standard straight down))

答案 1 :(得分:1)

图表中的虚线(1,7,9)可以通过以下方式找到:

trans <- apply(D, 2, function(x) head(x,-1)*10+tail(x,-1))

which(apply(trans, 1, function(y) (1 %in% y) && (10 %in% y) && !(11 %in% y) ))

#1 7 9 

说明:首先构建一个转换矩阵,然后找到从0到1和从1到0的转换的行,但不会出现连续性。