Используйте rle
, чтобы получить длины каждого повторяемого сечения, затем найдите позицию, добавив эти длины, и поднабор, чтобы получить желаемые прогоны. В первой строке мне нужно сначала unclass
rle, иначе data.frame
не знает, как с этим справиться.
out <- data.frame(unclass(rle(pre<=2)))
out$pos <- head(cumsum(c(1, out$lengths)), -1)
out[out$lengths>=3 & out$values,c("pos", "lengths")]
## pos lengths
## 17 3
## 49 6
## 56 3
Если вы предпочитаете цепочку с dplyr
, вот версия с этой идиомой.
rle(pre <= 2) %>% unclass() %>% data.frame() %>%
mutate(pos = c(1, lengths) %>% cumsum %>% head(-1)) %>%
filter(lengths >=3 & values) %>% select(pos, lengths)
(В предыдущей версии я использовал do.call
в первой строке, которая просто помещает результаты из rle
в data.frame
; do.call
просто вызывает функцию, указанную в первом аргументе со вторым аргументом в качестве его параметров. Это полезно, когда у вас есть список вещей (например, rle
return), которые вы хотите использовать в качестве параметров для функции. Код, безусловно, может быть написан без этого шага, он просто облегчает сохранение части и выводить только те строки, которые вы хотите.)