3

次のようなバイナリコード化されたマトリックス (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の実行の終わりを見つけたい(したがって、列がたまたま並んでいる場合は対角線の切り替え)。別の列がこの 1 の実行を維持した場合、対角線の切り替えはカウントされません。

したがって、対角線上のマトリックスでは、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がこのパターンを持っている場合、それらは行であるため、望ましい出力になります。

私は疑いがrleありcumsum、ここで役立つかもしれません。

編集問題に情報を追加します。別のマトリックスでリカルドの最初のソリューションを試しました:

   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 の行 (黄色のボックス) に到達すると、その行をスキップして、次の行のパス (パスはオレンジ色) からやり直します (対角パターンは記録されません)。

ここに画像の説明を入力

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

2 に答える 2

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))
于 2013-09-23T03:03:59.790 に答える
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 への遷移の両方が発生する行を見つけますが、1 の連続性は表示されません。

于 2013-09-23T03:05:30.370 に答える