我正在尝试将一系列间隔分解为更少,同样有意义的间隔。
例如考虑以下间隔列表
Intervals = list(
c(23,34),
c(45,48),
c(31,35),
c(7,16),
c(5,9),
c(56,57),
c(55,58)
)
因为间隔重叠,所以可以用很少的 vector 描述相同的间隔。绘制这些间隔可以很明显地看到,有四个 vector 列表就足够了
plot(1,1,type="n",xlim=range(unlist(Intervals)),ylim=c(0.9,1.1))
segments(
x0=sapply(Intervals,"[",1),
x1=sapply(Intervals,"[",2),
y0=rep(1,length(Intervals)),
y1=rep(1,length(Intervals)),
lwd=10
)
如何减少
Intervals
列表以携带与情节上显示的信息相同的信息? (性能问题)上面示例的期望输出是
Intervals = list(
c(5,16)
c(23,35),
c(45,48),
c(55,58)
)
最佳答案
您需要的是reduce
包中的IRanges
函数。
In.df <- do.call(rbind, Intervals)
library(IRanges)
In.ir <- IRanges(In.df[, 1], In.df[,2])
out.ir <- reduce(In.ir)
out.ir
# IRanges of length 4
# start end width
# [1] 5 16 12
# [2] 23 35 13
# [3] 45 48 4
# [4] 55 58 4