2016-05-02 43 views
3

Ich denke, es ist ein ziemlich grundlegendes Problem, aber ich möchte um zu sehen, ob jemand eine elegantere Lösung finden kann. Vielleicht durch Vermeiden der for-Schleife.Konvertieren (0,1,0, 0, 1, 1, 1) zu (0, 0, 0, 1, 0, 1, 2) in R

Ich möchte eine Funktion haben, die einen Vektor von 1 und 0 als Eingabe nimmt und einen Vektor gleicher Länge zurückgibt, der zählt, wie viele vorherige Positionen die gleiche Nummer gewesen ist.

Ein ziemlich unelegant Weg dies zu tun ist:

count_me <- function(x) { 
    count_vector <- numeric(length(x)) 
    for(i in 2:length(x)) { 
    if(x[i] == x[i-1]) count_vector[i] <- count_vector[i-1] + 1 
    } 
    count_vector 
} 

welche gibt genau das, was ich will:

> (p <- sample(c(0,1), size = 10, replace = TRUE)) 
[1] 0 1 0 1 1 0 0 1 1 1 
> count_me(p) 
[1] 0 0 0 0 1 0 1 0 1 2 

Antwort

7

Ich glaube, das sollte funktionieren:

sequence(rle(x)$lengths) - 1