2017-02-13 11 views
0

Скажем Я массив целых чисел, например:Как эффективно находить последовательность значений в R и работать на них

p<-c(0,1,0,0,0,1,1,0,1,0) 

Мне нужен эффективный способ, чтобы найти все последовательности максимум два " 0" . Я сделал:

j<-2 
while (j<length(p)) { 
    if(p[j-1]==1&&p[j]==0&&p[j+1]==1){ 
     #do stuff 
     j<-j+2 
    } else if (p[j-1]==1&&p[j]==0&&p[j+1]==0&&p[j+2]==1){ 
     #do stuff 
     j<-j+3 
    } else { 
     j<-j+1 
    } 
} 

, которая работает должным образом, но, так как я работаю с огромным вектором в реальном случае, я задаюсь вопросом, есть ли разумный способ сделать это.

+2

См. Также 'rle'. – Gregor

+0

что вы ожидаете? в вашем примере нет примеров «последовательностей максимум два» 0 ». – SymbolixAU

+0

@SymbolixAU - один 0 меньше двух 0, не так ли? Но я вообще согласен, что это не однозначно заданный вопрос. – thelatemail

ответ

0

Я не уверен, что вы пытаетесь сделать с этими значениями, поэтому я не знаю, хотите ли вы их подсчитать, определить, где они находятся, или изменить их. Надеюсь, вам это поможет.

library(dplyr) 
library(purrr) 

p <- c(0,1,0,0,0,1,1,0,1,0) 

Определить кругленькую структуру с данными по длинам кодировке и строковое представление этих трасс

p_rle <- bind_cols(rle(p)) %>% 
    mutate(str = strrep(values, lengths)) 

p_rle 
#> # A tibble: 7 x 3 
#> lengths values str 
#>  <int> <dbl> <chr> 
#> 1  1  0  0 
#> 2  1  1  1 
#> 3  3  0 000 
#> 4  2  1 11 
#> 5  1  0  0 
#> 6  1  1  1 
#> 7  1  0  0 

При необходимости, они могут быть разделены обратно из

p_rle$str 
#> [1] "0" "1" "000" "11" "0" "1" "0" 

Для явно выбирают только пробеги 0 с 2 или менее

filter(p_rle, values == 0, lengths <= 2) 
#> # A tibble: 3 x 3 
#> lengths values str 
#>  <int> <dbl> <chr> 
#> 1  1  0  0 
#> 2  1  0  0 
#> 3  1  0  0 

Если вы хотите узнать , где появятся, вы должны будете сделать что-то еще.