次のようなバイナリコード化されたマトリックス (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")