Compter le nombre d'alternances dans une séquence de retournement de pièce de monnaie
-
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.
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