Group_by, если перекрываются - PullRequest
0 голосов
/ 17 мая 2019

Я хотел бы знать, как группировать линии с перекрытием координат.

Я пытаюсь объединить перекрытия, основанные на координатах в сегменте (линии).

Например, у меня есть:

tibble(
  target = c("a", "a", "a", "b", "b", "c", "c", "c", "c"),
  query  = c("D", "D", "D", "D", "E", "D", "D", "E", "E"),
  start  = c(  3,  10,  30,   8,  16,   7,   9,  16,  25),
  end    = c( 12,  15,  45,  15,  20,  12,  14,  32,  31)
) -> d

или

# A tibble: 9 x 4
  target query start   end
  <chr>  <chr> <dbl> <dbl>
1 a      D         3    12
2 a      D        10    15
3 a      D        30    45
4 b      D         8    15
5 b      E        16    20
6 c      D         7    12
7 c      D         9    14
8 c      E        16    32
9 c      E        25    31

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

Итак, я пытаюсь сделать это

> d %>%
+   group_by(target, query) %>%
+   arrange(start,end) %>%
+   summarise(
+     start = min(start),
+     end = max(end)
+   )
# A tibble: 5 x 4
# Groups:   target [?]
  target query start   end
  <chr>  <chr> <dbl> <dbl>
1 a      D         3    45
2 b      D         8    15
3 b      E        16    20
4 c      D         7    14
5 c      E        16    32

Как видите, вывод неправильный. Каким-то образом я думаю, что я должен группировать по линиям с перекрытием, но я не знаю, как это сделать.

Ожидаемый результат:

  target query start   end
  <chr>  <chr> <dbl> <dbl>
1 a      D         3    15
2 a      D        30    45
3 b      D         8    15
4 b      E        16    20
5 c      D         7    14
6 c      E        16    32

Этот вид goup_by, использующий перекрытие, должен использоваться для других подходов.

Любая помощь приветствуется. Заранее спасибо

1 Ответ

1 голос
/ 17 мая 2019
d %>% 
  group_by(target, query) %>%
  arrange(start) %>%
  group_by(index = cumsum(cummax(lag(end, default = first(end))) < start), target, query) %>%
  summarise(start = first(start), end = max(end)) %>%
  arrange(target)

Дает следующий вывод:

# A tibble: 6 x 5
# Groups:   index, target [4]
  index target query start   end
  <int> <chr>  <chr> <dbl> <dbl>
1     0 a      D         3    15
2     1 a      D        30    45
3     0 b      D         8    15
4     0 b      E        16    20
5     0 c      D         7    14
6     0 c      E        16    32

Затем вы можете избавиться от столбца index, если он вам не нужен.

...