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