创建一系列间隔相等的

时间:2017-01-04 09:18:03

标签: r sequence

我想创建一个由N对实数组成的向量,其中每对由值S分隔,并且该对中的两个元素由值iS分开,可以这样写:

V=[(X,X+iS)_1, (X+S+iS,X+S+2*iS)_2, ...  ]

因此,如果我们从X=1开始,S=1iS = .5则应该返回:

V=[1.0,1.5,2.5,3.0,4.0,4.5]

我创建了这个功能,完全符合我的要求:

myseq<-function(x,n,sep,isep){
  res=c(x,x+isep)
  for(i in 1:(n-1)){
      prev=res[length(res)]
      res=c(res,c(prev+sep,prev+sep+isep))
  }
  return(res)
}

使用与之前相同的例子:

> myseq(1,3,1,.5)                                                             
[1] 1.0 1.5 2.5 3.0 4.0 4.5

但我相信它可以用更简单,更“功能”的方式编写,但我无法弄清楚。 如果您有任何想法?

3 个答案:

答案 0 :(得分:3)

以下是使用seq

的一个想法
myseq <- function(x, n, sep, isep) {
  v1 <- seq(x, n*2, sep)[c(rep(TRUE, 2), rep(FALSE, (isep/sep)-1))]
  return(v1[1:(n*2)])
  }

myseq(1,3, 0.5, 1)  
#[1] 1.0 1.5 2.5 3.0 4.0 4.5

答案 1 :(得分:2)

这是另一种方法,您可以创建2个不同的向量,然后将它们组合在一起以获得所需的序列。

<h2 class="text-center">Welcome to our Website</h2>

答案 2 :(得分:0)

在审查了我的问题之后,我意识到我接受的答案可能不是最好的答案,@ alexis_laz在他的评论中提出了一个简短而更好的解决方案。 我再次将它们放在这里,经过基准测试之后,看来

我的原始版本:

original<-function(x,n,sep,isep){
    res=c(x,x+isep)
    for(i in 1:(n-1)){
        prev=res[length(res)]
        res=c(res,c(prev+sep,prev+sep+isep))
    }
    return(res)
}

先前接受的答案:

accepted <- function(x,isep,sep,n){
    c(rbind(seq(x,by = isep+sep, length.out = n), seq(x+isep,by = isep+sep, length.out = n))) 
}

亚历克西斯的评论:

alexcomm <- function(x,n,sep,isep){
    cumsum(c(x, rep_len(c(isep, sep), (n * 2) - 1)))
}

和基准:

                      expr        min          lq        mean      median
 alexcomm(x, n, sep, isep)     99.657    105.0090    149.4527    109.1745
  accepted(x, isep, sep, n)    130.090    137.7555    193.6189    163.2150
  original(x, n, sep, isep) 251176.761 258936.2820 268247.7626 270124.8435

因此,评论中提出的解决方案不仅简短,而且速度更快。