> -----Original Message-----
> From: smu [mailto:m...@z107.de] 
> Sent: Wednesday, November 11, 2009 9:26 AM
> To: William Dunlap
> Cc: r-help@r-project.org
> Subject: Re: [R] partial cumsum
> 
> On Wed, Nov 11, 2009 at 08:53:50AM -0800, William Dunlap wrote:
> > 
> > Perhaps
> >    > ave(x, rev(cumsum(rev(is.na(x)))), FUN=cumsum)
> >     [1]  1  3  6 NA  5 11 18 26 35 45
> > 
> 
> it takes some time to understand how it works, but it's perfect.

Note that the 2nd argument assigns a group number
based on the number of NA's prior to the current
position in the vector.  The odd repeated calls to
rev() are there to put the NA's at the ends of the
groups, instead of at the beginnings:
   > x <- c(1, 2, 3, NA, 5, 6, 7, 8, 9, 10)
   > rev(cumsum(rev(is.na(x))))
    [1] 1 1 1 1 0 0 0 0 0 0
A more natural way to do this is
   > cumsum(is.na(c(NA,x[-length(x)])))
    [1] 1 1 1 1 2 2 2 2 2 2

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com  

> 
> thank you,
>  stefan
> 

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to