Hi all, I wonder if there is any way to calculate a moving average on an irregular time series, or use the rollapply function in zoo? I have a set of dates where I want to check if there has been an event 14 days prior to each time point in order to mark these timepoints for removal, and can't figure out a good way to do it. Many thanks in advance! Gustaf Example data: exData<-structure(list(Datebegin = structure(c(14476, 14569, 14576, 14621, 14627, 14632, 14661, 14671, 14705, 14715, 14751, 14756, 14495, 14518, 14523, 14526, 14528, 14529, 14545, 14548), class = "Date"), Event = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)), .Names = c("Datebegin", "Event" ), row.names = c(NA, 20L), class = "data.frame") ###In this example, row 18 is a date less than 14 days after an event and should be marked for removal. -- Gustaf Rydevik, M.Sci. tel: +46(0)703 051 451 address:Essingetorget 40,112 66 Stockholm, SE skype:gustaf_rydevik
> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Gustaf Rydevik > Sent: Thursday, June 03, 2010 7:24 AM > To: r-help at r-project.org > Subject: [R] moving average on irregular time series > > Hi all, > > > I wonder if there is any way to calculate a moving average on an > irregular time series, or use the rollapply function in zoo? > I have a set of dates where I want to check if there has been an event > 14 days prior to each time point in order to mark these timepoints for > removal, and can't figure out a good way to do it. > > Many thanks in advance! > > Gustaf > > > Example data: > > exData<-structure(list(Datebegin = structure(c(14476, 14569, > 14576, 14621, > 14627, 14632, 14661, 14671, 14705, 14715, 14751, 14756, 14495, > 14518, 14523, 14526, 14528, 14529, 14545, 14548), class = "Date"), > Event = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, > FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, > TRUE, FALSE, FALSE, FALSE)), .Names = c("Datebegin", "Event" > ), row.names = c(NA, 20L), class = "data.frame") > > ###In this example, row 18 is a date less than 14 days after an event > and should be marked for removal.The following function returns the number of days since the last event: f <- function (data) { # if the dataset were ordered by time the order() calls # at the start and end would not be needed. o <- order(data$Datebegin) data <- data[o, , drop = FALSE] lastEventRow <- which(data$Event)[cumsum(data$Event)] if (length(lastEventRow) < length(o)) { # i.e., earliest entries are not events lastEventRow <- c(rep(NA, length(o) - length(lastEventRow)), lastEventRow) } timeSinceLastEvent <- data$Datebegin - data$Datebegin[lastEventRow] timeSinceLastEvent[order(o)] } You can do tmp <- f(exData) exData[tmp>=14 | tmp$Event, , drop=FALSE] to select the events and the nonevents more than two weeks after an event. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> > > -- > Gustaf Rydevik, M.Sci. > tel: +46(0)703 051 451 > address:Essingetorget 40,112 66 Stockholm, SE > skype:gustaf_rydevik > > ______________________________________________ > 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. >
Replace the non-events with NA and then use na.locf from the zoo package to move the last event date up to give lastEvent. Then simply select those rows whose lastEvent date is at least 14 days ago or if the row itself is an Event:> library(zoo) # na.locf > > lastEvent <- with(exData, na.locf(ifelse(Event, Datebegin, NA), na.rm = FALSE)) > exData[beg >= lastEvent + 14 | exData$Event, ]Datebegin Event 1 2009-08-20 TRUE 2 2009-11-21 FALSE 3 2009-11-28 FALSE 4 2010-01-12 FALSE 5 2010-01-18 FALSE 6 2010-01-23 FALSE 7 2010-02-21 FALSE 8 2010-03-03 FALSE 9 2010-04-06 FALSE 10 2010-04-16 FALSE 11 2010-05-22 TRUE 12 2010-05-27 TRUE 13 2009-09-08 TRUE 14 2009-10-01 FALSE 15 2009-10-06 FALSE 16 2009-10-09 FALSE 17 2009-10-11 TRUE 19 2009-10-28 FALSE 20 2009-10-31 FALSE On Thu, Jun 3, 2010 at 10:23 AM, Gustaf Rydevik <gustaf.rydevik at gmail.com> wrote:> Hi all, > > > I wonder if there is any way to calculate a moving average on an > irregular time series, or use the rollapply function in zoo? > I have a set of dates where I want to check if there has been an event > 14 days prior to each time point in order to mark these timepoints for > removal, and can't figure out a good way to do it. > > Many thanks in advance! > > Gustaf > > > Example data: > > exData<-structure(list(Datebegin = structure(c(14476, 14569, 14576, 14621, > 14627, 14632, 14661, 14671, 14705, 14715, 14751, 14756, 14495, > 14518, 14523, 14526, 14528, 14529, 14545, 14548), class = "Date"), > ? ?Event = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, > ? ?FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, > ? ?TRUE, FALSE, FALSE, FALSE)), .Names = c("Datebegin", "Event" > ), row.names = c(NA, 20L), class = "data.frame") > > ###In this example, row 18 is a date less than 14 days after an event > and should be marked for removal. > > > > -- > Gustaf Rydevik, M.Sci. > tel: +46(0)703 051 451 > address:Essingetorget 40,112 66 Stockholm, SE > skype:gustaf_rydevik > > ______________________________________________ > 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. >