我有一系列'端点',例如:
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))
答案 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)
}
)