序列扩展问题

时间:2011-08-03 22:24:35

标签: r sequences

我有一系列'端点',例如:

c(7,10,5,11,15)     

我希望扩展到端点之间的“经过时间”序列,例如:

C(的 7 下,1,2,3,4,5,6,7,8,9,的 10 下,1,2,3,4, 5 下,1,2,3,4,5,6,7,8,9,10,的 11 下,1,2,3,4,5,6,7 ,8,9,10,11,12,13,14, 15

在R中最有效的方法是什么?我正在想象embed函数的一些创造性使用,但如果不使用丑陋的for循环,我就无法实现。

这是实现这一目标的天真方式:

expandSequence <- function(x) {
    out <- x[1]
    for (y in (x[-1])) {
        out <- c(out,seq(1,y))
    }
    return(out)
}

expandSequence(c(7,10,5,11,15))

3 个答案:

答案 0 :(得分:8)

有一个基本功能来执行此操作,称为等待它,sequence

sequence(c(7,10,5,11,15))

 [1]  1  2  3  4  5  6  7  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  1  2  3
[26]  4  5  6  7  8  9 10 11  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

在您的情况下,您的第一个端点实际上不是序列的一部分,因此它变为:

c(7, sequence(c(10,5,11,15)))
 [1]  7  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  1  2  3  4  5  6  7  8  9
[26] 10 11  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

答案 1 :(得分:4)

这个怎么样:

> unlist(sapply(x,seq))
 [1]  1  2  3  4  5  6  7  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  1  2
[25]  3  4  5  6  7  8  9 10 11  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

最后添加第一个元素:

c( x[1], unlist( sapply( x[seq(2,length(x))], seq ) ) )

稍微可读的版本:

library(taRifx)
c( x[1], unlist( sapply( shift(x,wrap=FALSE), seq ) ) )

答案 2 :(得分:3)

lapply()seq_len()的组合在这里很有用:

expandSequence <- function(x) {
    out <- lapply(x[-1], seq_len)
    do.call(c, c(x[1], out))
}

给出了

pts <- c(7,10,5,11,15)

> expandSequence(pts)
 [1]  7  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  1  2  3  4
[21]  5  6  7  8  9 10 11  1  2  3  4  5  6  7  8  9 10 11 12 13
[41] 14 15

(另一种选择是:

expandSequence <- function(x) {
    out <- lapply(x[-1], seq_len)
    unlist(c(x[1], out), use.names = FALSE)
}