Выделить вложенные интервалы - PullRequest
2 голосов
/ 10 марта 2019

Может ли кто-нибудь помочь с разбиением перекрывающихся или вложенных интервалов, используя r?

У меня есть следующий пример:

library (dplyr)

df_foo = read.table(
  textConnection("ID    From  To   Str

SA1    0    100   FOL
SA1    10   20    FOLWK
SA1    15   18    FOLST
SA1    20   50    FOLST
SA1    25   30    FOLWK"), header = TRUE
)

В выводе не должно быть перекрытия между интервалами, и он должен выглядетькак это:

   ID From  To   Str
1 SA1 0     10   FOL
2 SA1 10    15   FOLWK
3 SA1 15    18   FOLST
4 SA1 18    20   FOLWK
5 SA1 20    25   FOLST
6 SA1 25    30   FOLWK
7 SA1 30    50   FOLST
8 SA1 50    100  FOL

Любая помощь будет высоко ценится.Спасибо

1 Ответ

1 голос
/ 10 марта 2019

Вы, возможно, не найдете здесь каждый шаг полезным, и вы можете проверить это на больших примерах:

library(data.table)
dt <- data.table(df_foo)
setkeyv(dt, c("From", "To"))
dt.all <- foverlaps(dt, dt, by.x = c("From", "To"))

dt.all[To > i.To & i.From > From, `:=`(From = i.To)]
dt.all <- unique(dt.all[order(From)], by = "From")
dt.all[, from.next := shift(From, type = "lead")]
dt.all[!is.na(from.next), To := ifelse(To > from.next, from.next, To)]
dt.all[, str.grp := shift(Str, fill = TRUE) != Str]
dt.all[, str.grp.n := cumsum(str.grp)]
dt.all[, from.in.group := shift(From), by = .(Str, str.grp.n)]

dt.all[, to.previous := shift(To)]
dt.all[, from.previous := shift(From)]
dt.all[!is.na(from.in.group) & From == to.previous, `:=`(From = from.previous)]
res <- unique(dt.all[order(From, -To)], by = "From")

Надеюсь, это даст вам хорошее представление о том, как это сделать с таблицами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...