将数字向量转换为间隔列表

时间:2015-09-17 22:20:51

标签: r rcpp

我有以下载体

x <- c(1,3,4,5,8,9,10,13)

我希望将其转换为一组间隔:

iwant <-  list(1, c(3,5), c(8,10), 13)
iwant
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 3 5
#> 
#> [[3]]
#> [1]  8 10
#> 
#> [[4]]
#> [1] 13

有一种简单的方法可以将x转换成间隔组 R中的范围或Rcpp(真实x向量可能有多达~80M的值),我完全错过了?如果没有,有人可以指出我的算法,我似乎无法弄明白。

2 个答案:

答案 0 :(得分:2)

目前尚不清楚您希望如何做,但是在这里您可以重现预期的结果:

lapply(split(x,c(0,cumsum(diff(x)!=1))),
       function(y)if(length(y)>2) c(y[1],tail(y,1))else y)


$`0`
[1] 1

$`1`
[1] 3 5

$`2`
[1]  8 10

$`3`
[1] 13

答案 1 :(得分:1)

我不完全确定你是如何定义间隔的实例的,但是使用IRanges包(installation instructions)是一种方式。它有很好的文档。

require(IRanges)
reduce(IRanges(x, x))
# IRanges of length 4
#     start end width
# [1]     1   1     1
# [2]     3   5     3
# [3]     8  10     3
# [4]    13  13     1