R中的seq
函数会为我提供从x
到y
的序列,其中常量步骤m
:
seq(x, y, m)
E.g。 seq(1,9,2) = c(1,3,5,7,9)
。
使用交替步骤x
和y
从m1
到m2
获取序列的最优雅方法是什么,这样像"seq(x, y, c(m1, m2))"
这样的内容会给我c(x, x + m1, (x + m1) + m2, (x + m1 + m2) + m1, ..., y)
,每次添加其中一个步骤(当然不一定达到y
,如同seq
)?
示例:x = 1; y = 19; m1 = 2; m2 = 4
我得到c(1,3,7,9,13,15,19)
。
答案 0 :(得分:6)
我通过以下方式得到了解决方案:
1.将@RequestMapping(value="{userid}", method = RequestMethod.GET)
public @ResponseBody List<IterationInfo> getIterationInfoInJSON(@PathVariable int userid)
{
Configuration con = new Configuration();
con.configure("hibernate.cfg.xml");
SessionFactory SF = con.buildSessionFactory();
Session session= SF.openSession();
Transaction TR = session.beginTransaction();
Query query=session.createQuery("from IterationInfo");
List<IterationInfo> list=query.list();
for(IterationInfo iterationinfo1 : list)
{
System.out.println("Iteration id"+iterationinfo1.getIterationid());
System.out.println(iterationinfo1.getIterationname());
System.out.println(iterationinfo1.getProjectid());
System.out.println(iterationinfo1.getIterationenddate());
System.out.println(iterationinfo1.getIterationstartdate());
iterationinfo1.setIterationid(iterationinfo1.getIterationid());
iterationinfo1.setIterationname(iterationinfo1.getIterationname());
iterationinfo1.setProjectid(iterationinfo1.getProjectid());
iterationinfo1.setIterationenddate(iterationinfo1.getIterationenddate());
iterationinfo1.setIterationstartdate(iterationinfo1.getIterationstartdate());
}
TR.commit();
session.close();
SF.close();
return list;
}
与向量cumsum
一起使用,c(from,rep(by,times),...)
重复by
次。
2.按times = ceiling((to-from)/sum(by))
截断序列。
!(seq > to)
答案 1 :(得分:3)
您可以使用
生成此序列的第一个n
个术语
x = 1; m1 = 2; m2 = 4
n <- 0:10 # first 11 terms
x + ceiling(n/2)*m1 + ceiling((n-1)/2)*m2
# [1] 1 3 7 9 13 15 19 21 25 27 31
答案 2 :(得分:3)
这是另一个想法,
fun1 <- function(x, y, j, z){
if(j >= y) {return(x)}else{
s1 <- seq(x, y, j+z)
s2 <- seq(x+j, y, j+z)
return(sort(c(s1, s2)))
}
}
fun1(1, 19, 2, 4)
#[1] 1 3 7 9 13 15 19
fun1(1, 40, 4, 3)
#[1] 1 5 8 12 15 19 22 26 29 33 36 40
fun1(3, 56, 7, 10)
#[1] 3 10 20 27 37 44 54
fun1(1, 2, 2, 4)
#[1] 1
答案 3 :(得分:1)
以下是使用diffinv
的替代方法。此方法优先于分配值,因此作为停止规则,我得到的元素小于或等于停止值。
seqAlt <- function(start, stop, by1, by2) {
out <- diffinv(rep(c(by1, by2), ceiling(stop / (by1 + by2))), xi=start)
return(out[out <= stop])
}
seqAlt(1, 19, 2, 4)
[1] 1 3 7 9 13 15 19
答案 4 :(得分:1)
R
中回收载体的完美例子# 1.
x = 1; y = 19; m1 = 2; m2 = 4
(x:y)[c(TRUE, rep(FALSE, m1-1), TRUE, rep(FALSE,m2-1))]
# [1] 1 3 7 9 13 15 19
# 2.
x = 3; y = 56; m1 = 7; m2 = 10
(x:y)[c(TRUE, rep(FALSE, m1-1), TRUE, rep(FALSE,m2-1))]
# [1] 3 10 20 27 37 44 54
答案 5 :(得分:1)
您可以Reduce
与accumulate = TRUE
一起使用迭代添加2或4:
Reduce(`+`, rep(c(2,4), 10), init = 1, accumulate = TRUE)
# [1] 1 3 7 9 13 15 19 21 25 27 31 33 37 39 43 45 49 51 55 57 61
重复c(2,4)
的次数将决定序列长度;由于它是10以上,序列长度为20。
purrr
包有一个accumulate
包装器,如果您更喜欢语法:
purrr::accumulate(rep(c(2,4), 10), `+`, .init = 1)
## [1] 1 3 7 9 13 15 19 21 25 27 31 33 37 39 43 45 49 51 55 57 61