Group_by 如果重叠

Group_by if 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必须用于其他方法。

感谢任何帮助。 提前致谢

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