2013-05-29 12 views
5

mam wektora takZnalezienie elementów wektora o długości ponad 1 w R

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

ja jak znaleźć położenie, w którym szereg z co najmniej trzech następujących po sobie, 2'S, C (2,2, 2), zaczyna się i jeśli jest przerwany, chciałbym znaleźć następną pierwszą pozycję.

Wektor powrotny powinien wyglądać mniej więcej tak:

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

Próbowałem mecz i kilka innych funkcji, ale bez powodzenia

Odpowiedz

5

Oto jeden sposób:

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

Idealnie! Dziękuję Ci bardzo! – Mart

+0

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

Może to być nieco łatwiejsze do wykrycia niż odpowiedź Flodla, ale jego jest lepsze. –

0

Oto moja próba w funkcji:

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 
Powiązane problemy