1 と 0 のシーケンスがあり、交互の数を数えたいと思います。例えば
x <- rbinom(10, 1, 1/2)
> x
[1] 0 0 1 1 1 1 1 0 1 0
したがって、シーケンスが 1 から 0 に変わる (または反転する) 回数を (R で) カウントしたいと思います。上記のシーケンスでは、交互の数 (手でカウント) は 4 です。
1 と 0 のシーケンスがあり、交互の数を数えたいと思います。例えば
x <- rbinom(10, 1, 1/2)
> x
[1] 0 0 1 1 1 1 1 0 1 0
したがって、シーケンスが 1 から 0 に変わる (または反転する) 回数を (R で) カウントしたいと思います。上記のシーケンスでは、交互の数 (手でカウント) は 4 です。
diff() を使用できます:
> x <- rbinom(10,1,1/2)
> x
[1] 0 0 0 1 1 1 1 0 1 0
> sum(diff(x)!=0)
[1] 4
rle 関数は、ベクトル内の同じ値の「実行」の数をカウントします。したがって、このベクトルの長さ (マイナス 1) は、変更の数を示します。
> x
[1] 0 0 0 1 1 1 1 0 1 0
> rle(x)
Run Length Encoding
lengths: int [1:5] 3 4 1 1 1
values : num [1:5] 0 1 0 1 0
> length(rle(x)$lengths)-1
[1] 4
diff() メソッドよりも速いか遅いかもしれませんが、必要に応じて実行の長さも提供します...
エレガンスの点で diff に勝るものはありませんが、別の方法があります。
sum(x[-1] != head(x, n=-1))
私のシステムでは、これは少し速いようです:
> x <- rbinom(1e6, 1, 0.5)
> system.time(replicate(100, sum(x[-1] != head(x, n=-1))))
user system elapsed
8.421 3.688 12.150
> system.time(replicate(100, sum(diff(x) != 0)))
user system elapsed
9.431 4.525 14.248
シーケンス内の等しくない隣接要素の数の分布には、優れた分析ソリューションがあるはずです。
疑似コード (シーケンスはコイントスの配列です):
variable count = 0
variable state = sequence[0]
iterate i from sequence[1] to sequence[n]
if (state not equal sequence[i])
state = 1 - state
count++
カウントはあなたの結果でなければなりません