2017-12-30 28 views
2

の固定数をスキップしながら、私はこのベクトルを持っていると言う:抽出要素要素

a <- round(runif(100, 0, 1), digits = 0) 

私はその要素が見つかった後に番号1を含むベクターの最初の要素を見つけたいです、 3つの要素をスキップして(たとえ1を含んでいても)、1を含む次の要素を見つけ、1を見つけることを繰り返し、1を見つけた後に3つの要素をスキップします。

私の希望する出力は、スキップされた要素を考慮した後に、1を含む最初の要素の行番号と、1を含む残りの行番号です。

答えて

0

おそらくwhileループ?

set.seed(123) 
a <- round(runif(100,0,1), digits =0) 
n <- length(a) 
ind_less_n <- 1 
i <- 1 
index_save <- numeric(n) 
while(ind_less_n){ 
    if(a[i] == 1){ 
    index_save[i] <- 1 
    i <- i + 4 
    } else { 
    i <- i + 1 
    } 
    if(i > n) ind_less_n <- 0 
} 
head(cbind(a, index_save), 20) 
     a index_save 
[1,] 0   0 
[2,] 1   1 
[3,] 0   0 
[4,] 1   0 
[5,] 1   0 
[6,] 0   0 
[7,] 1   1 
[8,] 1   0 
[9,] 1   0 
[10,] 0   0 
[11,] 1   1 
[12,] 0   0 
[13,] 1   0 
[14,] 1   0 
[15,] 0   0 
[16,] 1   1 
[17,] 0   0 
[18,] 0   0 
[19,] 0   0 
[20,] 1   1 

あなたは私はあなたがループのいくつかの種類に頼ることなく、これを行うことができるとは思わないwhich(index_save == 1)

+0

右は...私+ 4にI + 3を変更しました。 – jrlewi

1

と行番号を抽出することができます。ここでそれを行う方法があります。まず、すべての位置のベクトルを取得します。次に、このベクトルの3番目以下の要素を繰り返し検索し、リストから削除します。あなたのプレデセサーにあまりにも近いものをすべて削除するまで繰り返す。

x = which(a==1) 
repeat { 
    to.remove = which(diff(x) <= 3)[1] + 1 
    if (is.na(to.remove)) break 
    x = x[-to.remove] 
} 

あなたは非常に大きなベクトルを扱っている場合は、これを行うには、より効率的な方法があるかもしれない、とスピードが問題になる場合、おそらくRCppを検討してください。

0

accumulate = TRUEまたはpurrr::accumulateを使用することができますが、結果とスキップ回数の別々の要素を持つリストを反復処理する必要があります。

library(tidyverse) 
set.seed(47) 

df_ones <- data_frame(a = rbinom(100, 1, .5), # make sample data 
         is_one = a, # initialize result and count 
         count = NA) %>% 
    split(seq(nrow(.))) %>% # split into list of one-row data frames 
    accumulate( # for each sequential pair of elements, return and pass on a list of... 
     ~list(a = .y$a, # the original value for checking, 
       is_one = if(.x$count <= 3) 0 else .y$is_one, # the result, changing 1 to 0 where required, and 
       # the count since a 1, resetting when a 1 is kept 
       count = if(.x$count > 3 & .y$is_one) { 
        1 
       } else { 
        .x$count + 1 
       }), 
     .init = list(a = NA, is_one = 0, count = 4) # set initial .x value 
    ) %>% 
    bind_rows() %>% # collapse resulting list to data frame 
    slice(-1) # remove row for initializing value 

df_ones 
#> # A tibble: 100 x 3 
#>  a is_one count 
#> <int> <dbl> <dbl> 
#> 1  1  1  1 
#> 2  0  0  2 
#> 3  1  0  3 
#> 4  1  0  4 
#> 5  1  1  1 
#> 6  1  0  2 
#> 7  0  0  3 
#> 8  0  0  4 
#> 9  1  1  1 
#> 10  1  0  2 
#> # ... with 90 more rows 

指標を抽出するために、

df_ones %>% 
    pull(is_one) %>% # extract result as vector 
    as.logical() %>% # coerce to Boolean 
    which() # get indices of TRUE values 
#> [1] 1 5 9 14 22 29 35 40 44 48 52 56 61 66 71 75 79 84 88 93 97 
関連する問題