2013-05-29 5 views
5

Ich habe ein Vektor wie dieseFinding Vektorelemente mit einer Länge von mehr als 1 in R

c(0,1,2,0,0,2,2,2,2,2,2,1,0,1,2,2,2,2,2,1) 

Ich mag würde die Position finden, wo eine Reihe von mindestens drei aufeinanderfolgenden 2 ES, C (2,2, 2), startet und wenn es unterbrochen wird, möchte ich die nächste erste Position finden.

Der Rückgabevektor sollte in etwa so aussehen:

FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 

I Spiel und einige andere Funktionen versucht, aber ohne Erfolg

Antwort

5

ist hier ein Weg:

x <- c(0,1,2,0,0,2,2,2,2,2,2,1,0,1,2,2,2,2,2,1) 
a <- rle(x) 
z <- rep(FALSE, length(x)) 
z[sequence(a$lengths) == 1] <- a$lengths >= 2 & a$values == 2 
z 
# [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE 
# [11] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
+0

Perfekt! Vielen Dank! – Mart

+0

Und vektorisiert +1 –

1
r <- rle(x) 
# Which entries are true in the result: 

w <- (cumsum(r$length)[r$values==2] - (r$length[r$values==2]-1))[r$length[r$values==2]>2] 
result <- logical(length(x)) 
result[w] <- T 
result 
## [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE 
## [17] FALSE FALSE FALSE FALSE 
+0

Dies könnte ein bisschen einfacher sein, als flodel Antwort herauszufinden, aber seine ist besser. –

0

Hier ist mein Versuch als Funktion:

FUN <- function(x, n = 3) { 
    y <- rle(x) 
    z <- y[[1]] > (n - 1) 
    unlist(lapply(1:length(z), function(i) { 
     m <- rep(FALSE, each=y[[1]][i]) 
     if(z[i]) { 
      m[1] <- TRUE 
     } 
     m 
    })) 
} 

FUN(x) 

## [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE 
## [11] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
Verwandte Themen