2013-05-29 25 views
5

1より私は、少なくとも3つの連続した2部の一連の位置を見つけたいこの長さのベクトル要素を見つける長いR

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

ようなベクターを有する、C(2,2、 2)、開始し、それが中断されている場合、私は次の最初の位置を見つけたいと思います。

戻りベクトルは次のようになります。私は試合や他のいくつかの機能を試してみましたが、成功せずにここで

答えて

5

が一つの方法です

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

を:

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

完璧!どうもありがとうございました! – Mart

+0

ベクトル化+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

これは、フラデルの答えよりも分かりやすいかもしれませんが、彼の方が優れています。 –

0

関数としての私の試みは次のとおりです。

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 
関連する問題