Dimitri Liakhovitski
2011-Mar-30 14:23 UTC
[R] summing values by week - based on daily dates - but with some dates missing
Dear everybody, I have the following challenge. I have a data set with 2 subgroups, dates (days), and corresponding values (see example code below). Within each subgroup: I need to aggregate (sum) the values by week - for weeks that start on a Monday (for example, 2008-12-29 was a Monday). I find it difficult because I have missing dates in my data - so that sometimes I don't even have the date for some Mondays. So, I can't write a proper loop. I want my output to look something like this: group dates value group.1 2008-12-29 3.0937 group.1 2009-01-05 3.8833 group.1 2009-01-12 1.362 ... group.2 2008-12-29 2.250 group.2 2009-01-05 1.4057 group.2 2009-01-12 3.4411 ... Thanks a lot for your suggestions! The code is below: Dimitri ### Creating example data set: mydates<-rep(seq(as.Date("2008-12-29"), length = 43, by = "day"),2) myfactor<-c(rep("group.1",43),rep("group.2",43)) set.seed(123) myvalues<-runif(86,0,1) myframe<-data.frame(dates=mydates,group=myfactor,value=myvalues) (myframe) dim(myframe) ## Removing same rows (dates) unsystematically: set.seed(123) removed.group1<-sample(1:43,size=11,replace=F) set.seed(456) removed.group2<-sample(44:86,size=11,replace=F) to.remove<-c(removed.group1,removed.group2);length(to.remove) to.remove<-to.remove[order(to.remove)] myframe<-myframe[-to.remove,] (myframe) -- Dimitri Liakhovitski Ninah Consulting www.ninah.com
Martyn Byng
2011-Mar-30 16:53 UTC
[R] summing values by week - based on daily dates - but with somedates missing
Hi, How about something like: sum.by.day <- function(ff) { by.day <- split(ff$value,weekdays(ff$dates)) lapply(by.day,sum) } by.grp <- split(myframe,myframe$group) lapply(by.grp,sum.by.day) Martyn -----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Dimitri Liakhovitski Sent: 30 March 2011 15:23 To: r-help Subject: [R] summing values by week - based on daily dates - but with somedates missing Dear everybody, I have the following challenge. I have a data set with 2 subgroups, dates (days), and corresponding values (see example code below). Within each subgroup: I need to aggregate (sum) the values by week - for weeks that start on a Monday (for example, 2008-12-29 was a Monday). I find it difficult because I have missing dates in my data - so that sometimes I don't even have the date for some Mondays. So, I can't write a proper loop. I want my output to look something like this: group dates value group.1 2008-12-29 3.0937 group.1 2009-01-05 3.8833 group.1 2009-01-12 1.362 ... group.2 2008-12-29 2.250 group.2 2009-01-05 1.4057 group.2 2009-01-12 3.4411 ... Thanks a lot for your suggestions! The code is below: Dimitri ### Creating example data set: mydates<-rep(seq(as.Date("2008-12-29"), length = 43, by = "day"),2) myfactor<-c(rep("group.1",43),rep("group.2",43)) set.seed(123) myvalues<-runif(86,0,1) myframe<-data.frame(dates=mydates,group=myfactor,value=myvalues) (myframe) dim(myframe) ## Removing same rows (dates) unsystematically: set.seed(123) removed.group1<-sample(1:43,size=11,replace=F) set.seed(456) removed.group2<-sample(44:86,size=11,replace=F) to.remove<-c(removed.group1,removed.group2);length(to.remove) to.remove<-to.remove[order(to.remove)] myframe<-myframe[-to.remove,] (myframe) -- Dimitri Liakhovitski Ninah Consulting www.ninah.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. ________________________________________________________________________ This e-mail has been scanned for all viruses by Star.\ _...{{dropped:12}}
Henrique Dallazuanna
2011-Mar-30 18:55 UTC
[R] summing values by week - based on daily dates - but with some dates missing
Try this: aggregate(value ~ group + format(dates, "%Y.%W"), myframe, FUN = sum) On Wed, Mar 30, 2011 at 11:23 AM, Dimitri Liakhovitski <dimitri.liakhovitski at gmail.com> wrote:> Dear everybody, > > I have the following challenge. I have a data set with 2 subgroups, > dates (days), and corresponding values (see example code below). > Within each subgroup: I need to aggregate (sum) the values by week - > for weeks that start on a Monday (for example, 2008-12-29 was a > Monday). > I find it difficult because I have missing dates in my data - so that > sometimes I don't even have the date for some Mondays. So, I can't > write a proper loop. > I want my output to look something like this: > group ? dates ? value > group.1 2008-12-29 ?3.0937 > group.1 2009-01-05 ?3.8833 > group.1 2009-01-12 ?1.362 > ... > group.2 2008-12-29 ?2.250 > group.2 2009-01-05 ?1.4057 > group.2 2009-01-12 ?3.4411 > ... > > Thanks a lot for your suggestions! The code is below: > Dimitri > > ### Creating example data set: > mydates<-rep(seq(as.Date("2008-12-29"), length = 43, by = "day"),2) > myfactor<-c(rep("group.1",43),rep("group.2",43)) > set.seed(123) > myvalues<-runif(86,0,1) > myframe<-data.frame(dates=mydates,group=myfactor,value=myvalues) > (myframe) > dim(myframe) > > ## Removing same rows (dates) unsystematically: > set.seed(123) > removed.group1<-sample(1:43,size=11,replace=F) > set.seed(456) > removed.group2<-sample(44:86,size=11,replace=F) > to.remove<-c(removed.group1,removed.group2);length(to.remove) > to.remove<-to.remove[order(to.remove)] > myframe<-myframe[-to.remove,] > (myframe) > > > > -- > Dimitri Liakhovitski > Ninah Consulting > www.ninah.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. >-- Henrique Dallazuanna Curitiba-Paran?-Brasil 25? 25' 40" S 49? 16' 22" O