data.table:在满足条件后删除所有行

时间:2016-07-29 16:27:32

标签: r data.table subset

我在这里阅读了很多关于数据子集的线程,但是我没有找到任何能够回答我关于对时间序列数据集进行子集化的具体问题。

我想要做的是找到满足条件的行,然后删除满足条件的第一行,以及它之后的所有行(无论它们是否满足条件)。

示例数据集:

AnimalID  Latitude  Longitude  Speed  Date  
99B       50.86190  -129.0875  5.6    2015-05-14 21:26:00 
99B       50.86170  -129.0875  0.6    2015-05-14 21:32:00
99B       50.86150  -129.0810  0.5    2015-05-14 21:33:00
99B       50.86140  -129.0800  0.3    2015-05-14 21:40:00

要查找满足条件的行,我有代码 DT[Speed < 0.8 & Date > as.POSIXct("2015-05-14 21:30:00"), by=AnimalID] 但是,我不知道如何删除行。

非常感谢

2 个答案:

答案 0 :(得分:4)

怎么样

require(data.table)

dt = data.table(
  AnimalID = rep('99B', 4),
  Latitude = c(50.86190,50.86170,50.86150,50.86140),
  Longitude = c(-129.0875,-129.0875,-129.0810,-129.0800),
  Speed = c(5.6,0.6,0.5,0.3),
  Date = as.POSIXct(c('2015-05-14 21:26:00', '2015-05-14 21:32:00', '2015-05-14 21:33:00', '2015-05-14 21:40:00')))

dt[, cond := Speed < 0.8 & Date > as.POSIXct("2015-05-14 21:30:00")]
dt[, cond_cumsum := cumsum(cond)] # everything > 0 follows a row that met the condition
dt_sub = dt[cond_cumsum == 0]

答案 1 :(得分:0)

您可以使用which

获取DF中第一个符合条件的项目的索引
index <- which(DT$Speed < 0.8 & DT$Date > as.POSIXct("2015-05-14 21:30:00"))[1]

或安全:

index <- min(which(DT$Speed < 0.8 & DT$Date > as.POSIXct("2015-05-14 21:30:00")))

然后,您可以删除从索引到最后一行的数据集中的行范围:

DT <- DT[-(index:nrow(DT))]