我想创建一个由N对实数组成的向量,其中每对由值S分隔,并且该对中的两个元素由值iS分开,可以这样写:
V=[(X,X+iS)_1, (X+S+iS,X+S+2*iS)_2, ... ]
因此,如果我们从X=1
开始,S=1
和iS = .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
但我相信它可以用更简单,更“功能”的方式编写,但我无法弄清楚。 如果您有任何想法?
答案 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
因此,评论中提出的解决方案不仅简短,而且速度更快。