我想创建一个从2开始到65结束的序列,它首先递增3,然后递增1,然后递增3,然后递增1,依此类推,给出如下所示的最终结果:
sequence(2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65)
Run Code Online (Sandbox Code Playgroud)
有谁知道如何生成这样的序列?
在R中使用回收,首先创建3到65之间的所有数字,然后只选择备用对!然后将2连接到它.
要选择备用对,我选择以下模式:c(FALSE,FALSE,TRUE,TRUE),这样前两个被拒绝,接下来被接受.例如c(3,4,5,6)[c(FALSE,FALSE,TRUE,TRUE)]表示3,4被拒绝,5,6被接受
c(2,c(3:65)[c(F,F,T,T)])
[1] 2 5 6 9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62
[32] 65
Run Code Online (Sandbox Code Playgroud)
由于我正在研究Rcpp,我认为应该就此进行探讨.谢谢你提出这个问题.完成了我在Rcpp的第一次任务:)
library(Rcpp)
cppFunction('NumericVector func(int start, int end){
int j = 0;
int len = ceil((end-start)/2);
if (end%2 != 0){
len+=1;
}
Rcpp::NumericVector result(len);
result[j++] = start;
int i = start;
while(j <= len){
if (j%2 == 0){
result[j++] = i+1;
i+=1;
}
else {
result[j++] = i+3;
i+=3;
}
}
return result;
}')
> func(2,65)
[1] 2 5 6 9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62 65
> func(2,20)
[1] 2 5 6 9 10 13 14 17 18
> func(1,10)
[1] 1 4 5 8
Run Code Online (Sandbox Code Playgroud)
容易推广
begin = 2
end = 65
d = c(3, 1)
l = length(d)
cumsum(c(begin, rep(d, len = (end-l)/l)))
[1] 2 5 6 9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62 65
Run Code Online (Sandbox Code Playgroud)