2013-05-29 41 views
5

Tôi có một véc tơ như thế nàyyếu tố vector Tìm với chiều dài dài hơn 1 R

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

tôi muốn tìm vị trí nơi một loạt các ít nhất ba liên tiếp 2, c (2,2, 2), bắt đầu và nếu nó bị gián đoạn tôi muốn tìm vị trí đầu tiên tiếp theo.

Các vector trở nên giống như thế này:

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

Tôi đã cố gắng trận đấu và một số chức năng khác nhưng không thành công

Trả lời

5

Dưới đây là một cách:

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

Hoàn hảo! Cảm ơn nhiều! – Mart

+0

Và vectơ +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

Điều này có thể dễ dàng hơn một chút để tìm ra câu trả lời của flodel, nhưng nó tốt hơn. –

0

Đây là nỗ lực của tôi với tư cách là một hàm:

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 
Các vấn đề liên quan