使用IRanges
:
require(IRanges)
x <- c(12,14,17,18,19,20,21,22,24,28,33,36,37,38,43)
o <- reduce(IRanges(x, width=1), min.gapwidth=2)
给出:
IRanges of length 6
start end width
# [1] 12 14 3
# [2] 17 24 8
# [3] 28 28 1
# [4] 33 33 1
# [5] 36 38 3
# [6] 43 43 1
这解决了你一半的问题。那些地方width = 1
,您想要获得适当的先前值。因此,让我们将其转换为 data.frame。
o <- as.data.frame(o)
o$start[o$width == 1] <- o$end[which(o$width == 1)-1]
o$width <- NULL
# start end
# 1 12 14
# 2 17 24
# 3 24 28
# 4 28 33
# 5 36 38
# 6 38 43
这给出了最终结果。
编辑:似乎 OP 在所需范围内错过了(14,17)。
ir <- IRanges(x, width = 1)
o1 <- reduce(ir, min.gapwidth = 2)
o2 <- gaps(o1)
start(o2) <- start(o2) - 1
end(o2) <- end(o2) + 1
o1 <- as.data.frame(o1[width(o1) > 1])
o2 <- as.data.frame(o2)
out <- rbind(o1, o2)
out <- out[with(out, order(start, end)), ]
# start end width
# 1 12 14 3
# 4 14 17 4
# 2 17 24 8
# 5 24 28 5
# 6 28 33 6
# 7 33 36 4
# 3 36 38 3
# 8 38 43 6