R 序列展开问题

R 序列展开问题,r,sequences,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,7,8,9,11,12,13,14,15) 在R中最有效的方法是什么?我正在设想如何创造性地使用embed函数,但如果不使用丑陋的for循环,我就无法达到这一目的 下面是一个简单的方法: expandSequence <- function

我有一系列“端点”,例如:

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,7,8,9,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))
expandSequence这个怎么样:

> 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 ) ) )

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

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

expandSequence有一个基本函数可以执行此操作,名为,wait it,
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

遗憾的是,我的解决方案不涉及粗体数字完美的我只需要
do.call(c,mapply(seq,1,x))
但是你的解决方案更好。除了这不是Q中显示的输出之外。根据Q,第一个元素应该是
7
。你有
1:7
。因此要完成这一点,你需要从
sapply
调用中省略
x
的第一个元素,然后将其添加到前面,为了得到OP想要的输出,对吗?如果OP想要的话。他在这里评论说输出是“完美的”,所以也许Q不是我们想要的?谢谢你提出了一个措辞巧妙、可重复的问题。+1很好的回答。随着@gsk和我的革新,它得到了有效的实施。我以前遇到过
sequence
,但假设它是
seq
的别名。很高兴了解这些不太常用的函数@安德莉:谢谢!对于我的下一个技巧,我将对
embed
函数进行反向工程。我喜欢重新发明轮子!
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