5

データをいくつかのテストに合格する連続した行のグループに分割したいと考えています。次に例を示します。

set.seed(1)
n   <-  29
ok  <-  sample(c(TRUE,FALSE),n,replace=TRUE,prob=c(.7,.3))

vec <- (1:n)[ok]
# [1]  1  2  3  5  8  9 10 11 12 13 14 16 19 22 23 24 25 26 27 28

目的の出力は、連続したシーケンスにグループ化された「vec」です。

out <- list(1:3,5,8:14,16,19,22:28)

これは機能します:

nv  <- length(vec)

splits <- 1 + which(diff(vec) != 1)
splits <- c(1,splits,nv+1)
nsp    <- length(splits)

out <- list()
for (i in 1:(nsp-1)){
    out[[i]] <- vec[splits[i]:(splits[i+1]-1)]
}

ベースRにはもっときれいな方法があると思います...?私はまだSO で見たrleとトリックに慣れていません...cumsum

4

1 に答える 1