使用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