R - 生成一系列数字

gia*_*iac 19 numbers r sequence

我正在尝试创建6个案例的序列,但间隔为144个案例.

比如这个

c(1:6, 144:149, 288:293)

1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
Run Code Online (Sandbox Code Playgroud)

我怎么能自动生成这样的序列

seq 
Run Code Online (Sandbox Code Playgroud)

还是与其他功能?

jos*_*ber 20

sequence在这种情况下,我发现该功能很有用.如果您的数据是这样的结构:

(info <- data.frame(start=c(1, 144, 288), len=c(6, 6, 6)))
#   start len
# 1     1   6
# 2   144   6
# 3   288   6
Run Code Online (Sandbox Code Playgroud)

然后你可以在一行中做到这一点:

sequence(info$len) + rep(info$start-1, info$len)
#  [1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
Run Code Online (Sandbox Code Playgroud)

请注意,即使您组合的序列长度不同,此解决方案仍然有效.

  • @giacomoV 如果起点和长度没有模式,那么当然您需要手动指定它们。如果起点和长度有一个模式,那么它会更容易。例如,如果您想要 100 个长度为 6 的序列,起点每次从 0 开始增加 144,您可以使用 `info &lt;- data.frame(start=seq(0, by=144, length.out=100), len=6)`。 (2认同)

Fra*_*ank 6

这是一种方法:

unlist(lapply(c(0L,(1:2)*144L-1L),`+`,seq_len(6)))
# or...
unlist(lapply(c(1L,(1:2)*144L),function(x)seq(x,x+5)))
Run Code Online (Sandbox Code Playgroud)

这是我喜欢的一种方式:

rep(c(0L,(1:2)*144L-1L),each=6) + seq_len(6)
Run Code Online (Sandbox Code Playgroud)

归纳...

rlen  <- 6L
rgap  <- 144L
rnum  <- 3L

starters <- c(0L,seq_len(rnum-1L)*rgap-1L)

rep(starters, each=rlen) + seq_len(rlen)
# or...
unlist(lapply(starters+1L,function(x)seq(x,x+rlen-1L)))
Run Code Online (Sandbox Code Playgroud)

  • @MikeWise是的,`seq_len`只是快一点,他们说,虽然我怀疑这个应用程序的重要性.只是习惯.另外,对于"泛化",我必须写`\`:\`(1,rlen)`这有点尴尬. (2认同)
  • @giacomoV不急于接受.我对自己的回答并不感到骄傲,所以我也会看到你将这个问题保持开放一两天,看看是否找到了更好的答案. (2认同)

Vee*_*kar 5

这也可以使用seq或完成seq.int

x = c(1, 144, 288)
c(sapply(x, function(y) seq.int(y, length.out = 6)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
Run Code Online (Sandbox Code Playgroud)

正如@Frank在这里的评论中提到的是使用@josilber的数据结构实现这一目标的另一种方法(这在不同的时间间隔需要不同的序列长度时特别有用)

c(with(info, mapply(seq.int, start, length.out=len)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293
Run Code Online (Sandbox Code Playgroud)

  • @CarlWitthoft不幸的是,`seq` /`seq.int`没有在`length.out`参数中进行矢量化.这只是意味着'mapply`将是要走的路,而不是'sapply`.使用josilber的数据结构,`c(with(info,mapply(seq.int,start,length.out = len))) (3认同)
  • 是的我知道.`seq(1L,length.out = 6)`的结果应该是一个整数向量是我的观点.我批评这个功能是如何工作的,而不是你的答案(这对我来说似乎是最好的).你的答案会"更好"(在我看来),但是,如果`x`是一个整数而`seq.int`用来代替`seq`,那么最终的结果就是整数向量(就像OP的例子一样) ). (2认同)