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
列。
我想知道如何对坐标重叠的线进行分组。
我正在尝试根据线段(线)中的坐标合并重叠。
比如我有:
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
列。