Hi, Can anyone suggest a clever way to compute a rolling weekly average of the columns in a matrix? The column bit is straightforward – use apply given a function which does what you want on a column. With regard to a particular column, the obvious way is to run a for loop indexing the last 7 days and computing the average . I simply would like to know if there is a better / quicker way. Code: Given a,> a= array(1:100, dim = c(17,2)) > a[,1] [,2] [1,] 1 18 [2,] 2 19 [3,] 3 20 [4,] 4 21 [5,] 5 22 [6,] 6 23 [7,] 7 24 [8,] 8 25 [9,] 9 26 [10,] 10 27 [11,] 11 28 [12,] 12 29 [13,] 13 30 [14,] 14 31 [15,] 15 32 [16,] 16 33 [17,] 17 34 one needs to start computing the average from obs 7 s (at obs 7 you have a full week to compute the average) and compute the rolling weekly average from day 7 onwards Results will look like b [,1] [,2] [1,] 4 14 [2,] 5 21 [3,] 6 22 [4,] 7 23 [5,] 8 24 [6,] 9 25 [7,] 10 26 [8,] 11 27 [9,] 12 28 [10,] 13 29 Thanks in advance, Paolo On 15 November 2010 20:59, wangwallace <talenttree@gmail.com> wrote:> > Hey, > > I am hoping someone can help me with a sampling question. > > I have a data frame of 8 variables (the first column is the subjects' id): > > SubID CSE1 CSE2 CSE3 CSE4 WSE1 WSE2 WSE3 WSE4 > 1 6 5 6 2 6 2 2 4 > 2 6 4 7 2 6 6 2 3 > 3 5 5 5 5 5 5 4 5 > 4 5 4 3 4 4 4 5 2 > 5 5 6 7 5 6 4 4 1 > 6 5 4 3 6 4 3 7 3 > 7 3 6 6 3 6 5 2 1 > 8 3 6 6 3 6 5 4 7 > > the 6 variables are categorized into two groups with CSE1, CSE2, CSE3, and > CSE4 in one group and the rest in another group. > > >sample(data[,2:4],2,replace=FALSE) > > CSE1 CSE2 > 1 6 5 > 2 6 4 > 3 5 5 > 4 5 4 > 5 5 6 > 6 5 4 > 7 3 6 > 8 3 6 > > Now I want to sample 1 column from another group of variables (i.e., WSE1, > WSE2, WSE3, WSE4), but I want to restrict a vector I am going to sample > from > to only those columns that are not correspond to GROUP 1 variables I have > sampled. That is, I want to sample a column from WSE3, WSE4 Columns > corresponding to CSE1 and CSE2 (i.e., WSE1, WSE2) need to be dropped. > > How can I do this? what if I want to repeat this whole process (drawing 2 > random columns from CSE1, CSE2, CSE3, and CSE4 first, AND then another > random column from WSE1, WSE2, WSE3, and WSE4) for 1000 times. any ideas? > > Many thanks in advance!! > > -- > View this message in context: > http://r.789695.n4.nabble.com/Sampling-problem-tp3043804p3043804.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > 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<http://www.r-project.org/posting-guide.html> > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
On Wed, 17 Nov 2010, Paolo Rossi wrote:> Hi, > Can anyone suggest a clever way to compute a rolling weekly average of the > columns in a matrix? The column bit is straightforward ? use apply given a > function which does what you want on a column. With regard to a particular > column, the obvious way is to run a for loop indexing the last 7 days and > computing the average . I simply would like to know if there is a better / > quicker way. > > > > Code: > Given a, > > > a= array(1:100, dim = c(17,2)) > > a > > [,1] [,2] > [1,] 1 18 > [2,] 2 19 > [3,] 3 20 > [4,] 4 21 > [5,] 5 22 > [6,] 6 23 > [7,] 7 24 > [8,] 8 25 > [9,] 9 26 > [10,] 10 27 > [11,] 11 28 > [12,] 12 29 > [13,] 13 30 > [14,] 14 31 > [15,] 15 32 > [16,] 16 33 > [17,] 17 34 > one needs to start computing the average from obs 7 s (at obs 7 you have a > full week to compute the average) and compute the rolling weekly average > from day 7 onwards > Results will look like b > [,1] [,2] > [1,] 4 14 > [2,] 5 21 > [3,] 6 22 > [4,] 7 23 > [5,] 8 24 > [6,] 9 25 > [7,] 10 26 > [8,] 11 27 > [9,] 12 28 > [10,] 13 29 > Thanks in advance, >I don't see how an average of 7 numbers all 18 or greater can be 14, as in your result[1, 2], unless you have mis-stated the question. Anyway, try: apply(a, 2, function(x) {cx <- cumsum(x); N <- length(x); (cx[7:N] - c(0, cx[1:(N-7)]))/7} HTH Ray Brownrigg> Paolo
On Nov 16, 2010, at 2:33 PM, Paolo Rossi wrote:> Hi, > Can anyone suggest a clever way to compute a rolling weekly average > of the > columns in a matrix? The column bit is straightforward ? use apply > given a > function which does what you want on a column. With regard to a > particular > column, the obvious way is to run a for loop indexing the last 7 > days and > computing the average . I simply would like to know if there is a > better / > quicker way.There is a rollmean function in package zoo. See below.> > > > Code: > Given a, >> a= array(1:100, dim = c(17,2)) >> a > [,1] [,2] > [1,] 1 18 > [2,] 2 19 > [3,] 3 20 > [4,] 4 21 > [5,] 5 22 > [6,] 6 23 > [7,] 7 24 > [8,] 8 25 > [9,] 9 26 > [10,] 10 27 > [11,] 11 28 > [12,] 12 29 > [13,] 13 30 > [14,] 14 31 > [15,] 15 32 > [16,] 16 33 > [17,] 17 34 > one needs to start computing the average from obs 7 s (at obs 7 you > have a > full week to compute the average) and compute the rolling weekly > average > from day 7 onwards > Results will look like b > [,1] [,2] > [1,] 4 14 > [2,] 5 21I think you got your first ones out of sequence: > apply(a, 2, rollmean, k=7) [,1] [,2] [1,] 4 21 [2,] 5 22 [3,] 6 23 [4,] 7 24 [5,] 8 25 [6,] 9 26 [7,] 10 27 [8,] 11 28 [9,] 12 29 [10,] 13 30 [11,] 14 31 -- David.> [3,] 6 22 > [4,] 7 23 > [5,] 8 24 > [6,] 9 25 > [7,] 10 26 > [8,] 11 27 > [9,] 12 28 > [10,] 13 29 > Thanks in advance, > > Paolo > > > > On 15 November 2010 20:59, wangwallace <talenttree at gmail.com> wrote: > >> >> Hey, >> >> I am hoping someone can help me with a sampling question. >> >> I have a data frame of 8 variables (the first column is the >> subjects' id): >> >> SubID CSE1 CSE2 CSE3 CSE4 WSE1 WSE2 WSE3 WSE4 >> 1 6 5 6 2 6 2 >> 2 4 >> 2 6 4 7 2 6 6 >> 2 3 >> 3 5 5 5 5 5 5 >> 4 5 >> 4 5 4 3 4 4 4 >> 5 2 >> 5 5 6 7 5 6 4 >> 4 1 >> 6 5 4 3 6 4 3 >> 7 3 >> 7 3 6 6 3 6 5 >> 2 1 >> 8 3 6 6 3 6 5 >> 4 7 >> >> the 6 variables are categorized into two groups with CSE1, CSE2, >> CSE3, and >> CSE4 in one group and the rest in another group. >> >>> sample(data[,2:4],2,replace=FALSE) >> >> CSE1 CSE2 >> 1 6 5 >> 2 6 4 >> 3 5 5 >> 4 5 4 >> 5 5 6 >> 6 5 4 >> 7 3 6 >> 8 3 6 >> >> Now I want to sample 1 column from another group of variables >> (i.e., WSE1, >> WSE2, WSE3, WSE4), but I want to restrict a vector I am going to >> sample >> from >> to only those columns that are not correspond to GROUP 1 variables >> I have >> sampled. That is, I want to sample a column from WSE3, WSE4 Columns >> corresponding to CSE1 and CSE2 (i.e., WSE1, WSE2) need to be dropped. >> >> How can I do this? what if I want to repeat this whole process >> (drawing 2 >> random columns from CSE1, CSE2, CSE3, and CSE4 first, AND then >> another >> random column from WSE1, WSE2, WSE3, and WSE4) for 1000 times. any >> ideas? >> >> Many thanks in advance!! >> >> -- >> View this message in context: >> http://r.789695.n4.nabble.com/Sampling-problem-tp3043804p3043804.html >> Sent from the R help mailing list archive at Nabble.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<http://www.r-project.org/posting-guide.html >> > >> and provide commented, minimal, self-contained, reproducible code. >> > > [[alternative HTML version deleted]] > > ______________________________________________ > 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.David Winsemius, MD West Hartford, CT