2016-07-29 49 views
2

我在這裏閱讀了許多有關子集數據的主題,但是我還沒有找到任何答案關於對時間序列數據集進行子集化的具體問題。data.table:符合條件後刪除所有行

我想要做的是找到符合條件的行,然後刪除滿足條件的第一行以及其後的所有行(不管它們是否滿足條件)。

一個例子數據集:

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

非常感謝

+0

你有'AnimalID'爲分組變量? – akrun

+0

嘗試使用dput發佈您的示例,以便其他人可以嘗試,並添加data.table標記,如果您認爲它是相關的。不需要在標題中寫入「標籤」。 – Frank

+1

如果分組不是問題,那麼DT [1:其中(速度<0.8&Date> as.POSIXct(「2015-05-14 21:30:00」)[1]]''可以工作 – lmo

回答

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] 
+0

我在我的數據的一個子集上嘗試了這一點,它工作得很好,現在我需要擴展它。非常感謝! – Splash1199

0

你可以得到該指數在DF會議的第一項條件使用which

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))] 
+0

'which'中的項目總是訂購。這兩種方式對於'哪個'返回一個空矢量都是不安全的。 – Frank

+0

@Frank在什麼情況下'哪個'會返回一個空的矢量而不滿足條件? – Warner

+0

是的,這就是我的意思。這是我可能擔心的唯一情況。我不確定你在考慮min時考慮到什麼情況,但據我所知,只要條件在某個地方得到滿足,它就不會做任何不同的事情。 – Frank