Ich möchte meine Daten in Gruppen von aufeinanderfolgenden Zeilen teilen, die einen Test bestehen. Hier ein Beispiel:Aufteilen (1: n) [boolean] in zusammenhängende Sequenzen
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
Die gewünschte Ausgabe wird "VEC" gruppiert in zusammenhängende Sequenzen:
out <- list(1:3,5,8:14,16,19,22:28)
Dies funktioniert:
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)]
}
Ich vermute, es ist ein sauberer Weg in der Basis R ...? Ich bin noch nicht geschickt mit den rle
und cumsum
Tricks, die ich auf SO gesehen habe ...
Danke. Nachdem ich Ihre Lösung seziert hatte, fand ich, dass ich diese Form bevorzuge: 'split (vec, cumsum (c (0, diff (vec)> 1))). – Frank