[R] Recursive decreasing sequences

Marc Schwartz MSchwartz at mn.rr.com
Fri Oct 20 22:30:57 CEST 2006


On Fri, 2006-10-20 at 15:11 -0500, Marc Schwartz wrote:
> On Fri, 2006-10-20 at 12:51 -0700, Julian Burgos wrote:
> > Hello fellow R's,
> > 
> > I'm sure there must be an easy way to do this.  But after digging in the 
> > documentation and thinking about it for a while I couldn't figure it 
> > out.  I need to get a decreasing recursive vector in.  I mean something 
> > like this: if starting at 2, and ending at 6, the vector should be
> > 
> >  2 3 4 5 6 3 4 5 6 4 5 6 5 6 6
> > 
> > An easy way would be to do this
> > 
> >     x <- integer(0)
> >     for (i in 5) x <- c(x, i:5)
> > 
> > But I need to create really long vectors (where the ending value is in 
> > the order of 6500) , and using loops is way to slow.  I'm looking for a 
> > vectorized method.  Any help will be welcomed.
> 
> How about this:
> 
> Range <- c(2:6)
> 
> > unlist(sapply(seq(along = Range), function(x) Range[x]:max(Range)))
>  [1] 2 3 4 5 6 3 4 5 6 4 5 6 5 6 6
> 
> 
> Then:
> 
> Range2 <- 2:6500
> 
> > str(Range2)
>  int [1:6499] 2 3 4 5 6 7 8 9 10 11 ...
> 
> 
> system.time(res <- unlist(sapply(seq(along = Range2), 
>                                  function(x) Range2[x]:max(Range2))))
> [1] 0.492 0.136 0.647 0.000 0.000
> 
> 
> > str(res)
>  int [1:21121750] 2 3 4 5 6 7 8 9 10 11 ...
> 
> 
> HTH,
> 
> Marc Schwartz


Here is a somewhat faster version, contained within a function call so
that max(Range) is not calculated for each iteration:

Rec.Seq <- function(Min, Max)
{
  Range <- Min:Max
  unlist(sapply(seq(along = Range), function(x) Range[x]:Max))
}


> system.time(Res <- Rec.Seq(2, 6500))
[1] 0.252 0.176 0.450 0.000 0.000

> str(Res)
 int [1:21121750] 2 3 4 5 6 7 8 9 10 11 ...


HTH,

Marc Schwartz



More information about the R-help mailing list