Re: [R] Moving window per group

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Thu, 10 Mar 2011 16:44:29 -0500

On Thu, Mar 10, 2011 at 11:27 AM, mathijsdevaan <mathijsdevaan_at_gmail.com> wrote:
> Hi,
>
> I have a data.frame of the following type:
>
> F = data.frame(read.table(textConnection("    A  B
> 1 1  4
> 2 1  3
> 3 1  1
> 4 1  4
> 5 1  2
> 6 1  2
> 7 1  2
> 8 2  1
> 9 2  1
> 10 2  1
> 11 2  1
> 12 3  2
> 13 3  4
> 14 3  1
> 15 3  1
> 16 3  1"),head=TRUE,stringsAsFactors=FALSE))
>
> F
>   A B
> 1  1 4
> 2  1 3
> 3  1 1
> 4  1 4
> 5  1 2
> 6  1 2
> 7  1 2
> 8  2 1
> 9  2 1
> 10 2 1
> 11 2 1
> 12 3 2
> 13 3 4
> 14 3 1
> 15 3 1
> 16 3 1
>
> I want to generate a new column in which I calculate the (cum)sum of the
> last 3 B's for each group A, so that F$C becomes:
>
>   A B C
> 1  1 4 0
> 2  1 3 4
> 3  1 1 7
> 4  1 4 8
> 5  1 2 8
> 6  1 2 7
> 7  1 2 8
> 8  2 1 0
> 9  2 1 1
> 10 2 1 2
> 11 2 1 3
> 12 3 2 0
> 13 3 4 2
> 14 3 1 6
> 15 3 1 7
> 16 3 1 6
>
> I tried this:
> library(zoo)
> F$C = rollapply(as.zoo(F$B), 3, FUN = function(x) cumsum(x)-(x),na.pad=TRUE)
>

Try this:

   library(zoo)

   roll <- function(x) {

      x <- zoo(c(0, 0, 0, x))
      rollapply(x, 4, sum, align = "right") - x
   }
   F$C <- unlist(tapply(F$B, F$A, roll))

In the unreleased version of zoo there is a partial= argument on rollapply which will make it possible to reduce roll, above, to this:

   roll <- function(x) rollapply(x, 4, sum, align = "right", partial = TRUE) - x

-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com

______________________________________________
R-help_at_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.
Received on Thu 10 Mar 2011 - 21:47:18 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 11 Mar 2011 - 10:40:21 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive