我正在尝试将一系列间隔分解为更少,同样有意义的间隔。

例如考虑以下间隔列表

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
    )

r - 如何在R中将间隔数据合并为更少的间隔?-LMLPHP

如何减少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

10-07 22:00