Domanda

Ho una sequenza di uno e zero e vorrei contare il numero di alternanze. per es.

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

Così desidero contare (in R) quante volte si alterna sequenza (o flip) da uno a zero. Nella sequenza di sopra del numero di alternanze (contati a mano) è 4.

È stato utile?

Soluzione

È possibile utilizzare 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

Altri suggerimenti

La funzione RLE conterà il numero di 'corre' dello stesso valore in un vettore. Quindi la lunghezza di questo vettore (meno 1) ti dà il numero di alterazioni:

> 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

Potrebbe essere più veloce o più lento rispetto al metodo diff (), ma ti dà anche le tirature, se ne avete bisogno ...

E 'sicuramente non batte diff in termini di eleganza, ma in un altro modo:

sum(x[-1] != head(x, n=-1))

Sul mio sistema, questo sembra essere un po 'più veloce Teeny:

> 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

Sembra che ci deve essere una soluzione analitica piacevole per la distribuzione del numero di elementi adiacenti diseguali nella sequenza.

pseudocodice (sequenza è una matrice con la vostra moneta ribalta):

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

conteggio dovrebbe essere il risultato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top