创建一系列等距的对
Create a sequence of pairs equally spaced
我想创建一个由 N 对实数组成的向量,其中每对由一个值 S 分隔,并且该对的两个元素由一个值 iS 分隔,可以这样写:
V=[(X,X+iS)_1, (X+S+iS,X+S+2*iS)_2, ... ]
所以如果我们从 X=1
开始,使用 S=1
和 iS = .5
它应该 return:
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
但我确信它可以用更简单和更 "functional" 的方式编写,但我想不出来。
如果你有什么想法?
这是一个使用 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
这是另一种方法,您可以创建 2 个不同的向量,然后交替组合它们以获得所需的序列。
myfun=function(i,x,y,n){
c(rbind(seq(i,by = x+y, length.out = n), seq(i+x,by = x+y, length.out = n)))
}
myfun(1,0.5,1,3)
[1] 1.0 1.5 2.5 3.0 4.0 4.5
在查看我的问题后,我意识到我接受的答案可能不是最好的,@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
因此评论中提出的解决方案不仅短而且速度稍快。
我想创建一个由 N 对实数组成的向量,其中每对由一个值 S 分隔,并且该对的两个元素由一个值 iS 分隔,可以这样写:
V=[(X,X+iS)_1, (X+S+iS,X+S+2*iS)_2, ... ]
所以如果我们从 X=1
开始,使用 S=1
和 iS = .5
它应该 return:
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
但我确信它可以用更简单和更 "functional" 的方式编写,但我想不出来。 如果你有什么想法?
这是一个使用 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
这是另一种方法,您可以创建 2 个不同的向量,然后交替组合它们以获得所需的序列。
myfun=function(i,x,y,n){
c(rbind(seq(i,by = x+y, length.out = n), seq(i+x,by = x+y, length.out = n)))
}
myfun(1,0.5,1,3)
[1] 1.0 1.5 2.5 3.0 4.0 4.5
在查看我的问题后,我意识到我接受的答案可能不是最好的,@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
因此评论中提出的解决方案不仅短而且速度稍快。