Dimitri Liakhovitski
2011-May-03 20:49 UTC
[R] turning data with start and end date into daily data
Hello! I have data that contain, among other things the date for the beginning and for the end of a (daily) time series (see example below - "mydata") mystring1<-c("String 1", "String 2") mystring2<-c("String a", "String b") starts<-c(as.Date("2011-02-01"),as.Date("2011-03-02")) ends<-c(as.Date("2011-03-15"),as.Date("2011-03-31")) values<-c(2000,10000) mydata<-data.frame(starts=starts,ends=ends,values=values,mystring1=mystring1,mystring2=mystring2) (mydata) I have to reshape it so that: for each row of "mydata" I have daily time series that start on the start date and end on the end date; what used to be in the column "values" has to be distributed equally across those dates; all other columns keep their original values. My code below does it (see the end result "newdata"). However, to achieve my goal, I am looping through rows of "mydata" - I am not sure it will work with my real data set that already has thousands of rows and also a lot of other columns with strings. I am afraid I'll run out of memory. Is there maybe a way of doing it more efficiently? Thanks a lot for your pointers! newdata<-data.frame(mydate=NA,myvalues=NA,mystring1=NA,mystring2=NA) for(i in 1:nrow(mydata)){ # i<-2 start.date = mydata[i,"starts"] end.date = mydata[i,"ends"] all.dates = seq(start.date, length = end.date - start.date, by = "day") temp.df <- data.frame(mydate = all.dates) temp.df$myvalues = mydata[i,"values"]/length(all.dates) temp.df[names(mydata)[4:5]] = mydata[i,4:5] newdata<-rbind(newdata,temp.df) } newdata<-newdata[-1,] (newdata);(mydata) -- Dimitri Liakhovitski Ninah Consulting www.ninah.com
Reasonably Related Threads
- summing values by week - based on daily dates - but with some dates missing
- merging 2 frames while keeping all the entries from the "reference" frame
- cbind in aggregate formula - based on an existing object (vector)
- using "aggregate" when variable names contain spaces
- Creating a "shifted" month (one that starts not on the first of each month but on another date)