Compter le nombre d'alternances dans une séquence de retournement de pièce de monnaie

StackOverflow https://stackoverflow.com/questions/3666969

  •  01-10-2019
  •  | 
  •  

Question

J'ai une séquence de uns et de zéros et je voudrais compter le nombre d'alternances. par exemple.

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

Ainsi, je voudrais compter (en R) combien de fois alterne des séquences (ou flips) d'un à zéro. Dans la séquence ci-dessus le nombre d'alternances (compté à la main) est de 4.

Était-ce utile?

La solution

Vous pouvez utiliser 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

Autres conseils

La fonction RLE comptera le nombre de « runs » de la même valeur dans un vecteur. D'où la longueur de ce vecteur (moins 1) vous donne le nombre de modifications:

> 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

pourrait être plus rapide ou plus lent que la méthode diff (), mais il vous donne également les longueurs d'exécution si vous avez besoin ...

Il ne doute pas battu diff en termes d'élégance, mais une autre façon:

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

Sur mon système, cela semble être un peu plus vite 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

Il semble qu'il devrait y avoir une solution analytique agréable pour la distribution du nombre d'éléments adjacents inégaux dans la séquence.

pseudocode (séquence est un tableau avec la pièce de monnaie se retourne):

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

count devrait être votre résultat

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top