2017-02-13 29 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" 

要明確選擇只有02或更少的運行

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 

如果您想知道其中他們出現了,您需要執行其他操作。

相關問題