使用交替步骤在R中获取seq()

时间:2017-01-11 09:00:24

标签: r seq

R中的seq函数会为我提供从xy的序列,其中常量步骤m

seq(x, y, m)

E.g。 seq(1,9,2) = c(1,3,5,7,9)

使用交替步骤xym1m2获取序列的最优雅方法是什么,这样像"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)

6 个答案:

答案 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)

您可以Reduceaccumulate = 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