2013-05-29 27 views
5

的長度比1個較長查找的向量元素我有一個這樣的矢量與R中

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

我想找到的位置,其中(一系列連續的至少三個2的,C 2,2, 2)開始,如果它被中斷,我想找到下一個第一個位置。

返回載體應該是這個樣子:

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

我試圖匹配等多種功能,但沒有成功

回答

5

這裏有一種方法:

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

這可能比flodel的答案更容易理解,但他更好。 –

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