如何在特定条件的行周围删除数据框中的行缓冲区

时间:2017-07-15 12:04:29

标签: r for-loop dataframe subset

我正在尝试删除符合特定条件的行之后x行内的数据框中的行。

我有一个带有响应变量的数据框,一个表示条件的测量类型和时间。这是一个模拟数据集:

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')

在这个模拟的情况下,我想在条件2发生后删除条件1中的前5行。

我想解决这个问题的方法是生成一个单独的向量,确定每个观察点1的距离是从最后的2开始。这里是我写的代码:

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
    }
}

这段代码可以解决问题,但效率极低。我想知道是否有人有更聪明,更快的解决方案。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这应该可以解决问题:

criteria1 = which(data$Type[2:nrow(data)] == 2 & data$Type[2:nrow(data)] != data$Type[1:nrow(data)-1]) +1
criteria2 = as.vector(sapply(criteria1,function(x) seq(x,x+5)))
data[-criteria2,]

工作原理:

  1. criteria1包含其中Type == 2的索引,但前一行的类型不同。奇怪的lookign子集如2:nrow(数据)是因为我们想要比较前一行,但是对于第一行没有前一行。因此我们在最后添加+1。
  2. criteria2包含以criteria1中的数字开头的序列,以及那些数字+5
  3. 第三行执行子集
  4. 这可能需要稍加修改,我不清楚您的代码中的标准1和标准2是什么。如果有效,或者您需要更多建议,请告诉我们!