Мы можем использовать rleid
из data.table
. Создан индекс группировки на основе значений «покрытия» меньше 10, подмножество «позиции», где количество строк больше или равно 4 и all
из «покрытия» меньше 10, затем используйте «grp ', чтобы получить элементы first
и last
из' position '
library(data.table)
setDT(df1)[, position[.N >=4 & all(coverage < 10)],
.(grp = rleid(coverage < 10))][,
.(start = first(V1), end = last(V1)), grp][, grp := NULL][]
# start end
#1: 2 6
#2: 100 104
Или с dplyr
library(dplyr)
df1 %>%
group_by(grp = rleid(coverage < 10)) %>%
filter(all(coverage < 10), n() >=4) %>%
group_by(grp) %>%
summarise(start = first(position), end = last(position)) %>%
select(-grp)
Или с rle
из base R
rl <- rle(df1$coverage < 10)
do.call(rbind, lapply(split(df1$position,
rep(seq_along(rl$values), rl$lengths)), range)[rl$values & rl$lengths >= 4])
данные
df1 <- structure(list(position = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 100L,
101L, 102L, 103L, 104L, 105L), coverage = c(30L, 2L, 1L, 8L,
2L, 3L, 20L, 40L, 0L, 2L, 3L, 4L, 1L, 40L)), class = "data.frame",
row.names = c(NA,
-14L))