序列扩展问题

发布于 2024-11-27 16:33:13 字数 619 浏览 3 评论 0原文

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

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

I have a sequence of 'endpoints', e.g.:

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

that I want to expand to a sequence of 'elapsed time' between the endpoints, e.g.

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)

Whats the most efficient way to do this in R? I'm imagining some creative use of the embed function, but I can't quite get there without using a ugly for loop.

Here's the naive way to do this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

ぶ宁プ宁ぶ 2024-12-04 16:33:13

有一个基本函数可以执行此操作,称为,等待它,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

There is a base function to do this, called, wait for 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

In your case it seems your first endpoint is in fact not part of the sequence, so it becomes:

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
゛清羽墨安 2024-12-04 16:33:13

怎么样:

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

How about this:

> 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

With the first element added on at the end:

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

And a slightly more readable version:

library(taRifx)
c( x[1], unlist( sapply( shift(x,wrap=FALSE), seq ) ) )
苏辞 2024-12-04 16:33:13

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

:)

A combination of lapply() and seq_len() is useful here:

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

Which gives for

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

(An alternative is:

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

)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文