【问题标题】:data.table: removing ALL rows after a condition is metdata.table:满足条件后删除所有行
【发布时间】:2016-12-04 10:44:18
【问题描述】:

我在这里阅读了很多关于子集数据的主题,但我没有找到任何可以回答我关于子集时间序列数据集的具体问题的任何内容。

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

一个示例数据集:

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] 但是,我不知道如何删除这些行。

非常感谢

【问题讨论】:

  • 你有AnimalID作为分组变量吗?
  • 尝试使用 dput 发布您的示例,以便其他人可以尝试,如果您认为相关,请添加 data.table 标记。无需在标题中写“标签”。
  • 如果分组不是问题,DT[1:which(Speed < 0.8 & Date > as.POSIXct("2015-05-14 21:30:00")[1]] 可能会起作用。
  • @lmo 他们也需要删除符合条件的obs。
  • @Frank OK DT[1:(which(Speed < 0.8 & Date > as.POSIXct("2015-05-14 21:30:00")[1]-1)] 略有改动。

标签: r data.table subset


【解决方案1】:

怎么样

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]

【讨论】:

  • 我在我的数据子集上尝试了这个,效果很好,现在我需要扩大规模。非常感谢!
【解决方案2】:

您可以使用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))]

【讨论】:

  • which 中的项目始终是有序的。对于 which 返回一个空向量,这两种方式都是不安全的。
  • @Frank 在什么情况下which 会在不满足条件的情况下返回一个空向量?
  • 是的,我就是这个意思。这是我唯一可能担心的情况。我不确定您在考虑 min 时考虑了什么情况,但据我所知,只要在某个地方满足条件,它就不会做任何不同的事情。
  • 是的,我怀疑which 总是返回一个有序向量。我不确定是否存在不正确的情况,因此 min 可以解释这一点。
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2019-02-13
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多