質問

私は一連のものとゼロを持っています、そして、私は交互の数を数えたいと思います。例えば

x <- rbinom(10, 1, 1/2)
> x
 [1] 0 0 1 1 1 1 1 0 1 0

したがって、私は(Rで)シーケンスが1つからゼロに交互に(またはフリップ)する回数を数えたいと思います。上記のシーケンスでは、交互の数(手でカウント)は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

シーケンス内の不均等な隣接する要素の数を分布するための優れた分析ソリューションがあるはずです。

pseudocode(シーケンスは、コインフリップを備えた配列です):

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++

カウントはあなたの結果でなければなりません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top