如果有重叠

时间:2019-05-17 16:39:31

标签: r group-by dplyr tidyverse overlap

我想知道如何将坐标重叠的线分组。

我正在尝试根据段(线)中的坐标合并重叠。

例如,我有:

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 个答案:

答案 0 :(得分:1)

#undef complex

给出以下输出:

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 列。