How to drop a buffer of rows in a data frame around rows of a certain condition

Viewed 68

I am trying to remove rows in a data frame that are within x rows after rows meeting a certain condition.

I have a data frame with a response variable, a measurement type that represents the condition, and time. Here's a mock data set:

data <- data.frame(rlnorm(45,0,1),
        c(rep(1,15),rep(2,15),rep(1,15)),
        seq(
            from=as.POSIXct("2012-1-1 0:00", tz="EST"),
            to=as.POSIXct("2012-1-1 0:44", tz="EST"),
            by="min"))
names(data) <- c('Variable','Type','Time')

In this mock case, I want to delete the first 5 rows in condition 1 after condition 2 occurs.

The way I thought about solving this problem was to generate a separate vector that determines the distance that each observation that is a 1 is from the last 2. Here's the code I wrote:

dist = vector()
for(i in 1:nrow(data)) {

    if(data$Type[i] != 1) dist[i] <- 0

    else {
      position = i
      tempcount = 0
      while(position > 0 && data$Type[position] == 1){
          position = position - 1
          tempcount = tempcount + 1
      }
      dist[i] = tempcount
    }
}

This code will do the trick, but it's extremely inefficient. I was wondering if anyone had some cleverer, faster solutions.

1 Answers
Related