我有具有日期時間戳的位置數據。這些地點應該定期收集,但並非總是如此。我需要提取時間窗口內的那些位置。所以,例如,相隔12個小時的地點。如果我從位置1的日期時間開始,找到12小時後的下一個位置。如果沒有一個正好12個小時,那麼第二個最接近新的指定時間。然後採取新的位置,並在12小時內找到下一個。我必須爲每個唯一ID進行此操作。基於日期時間差或窗口的子集數據
COLLAR_ID dt
2159 2006-01-27 13:02:55
2159 2006-01-27 14:01:12
2159 2006-01-27 15:01:04
2159 2006-01-27 16:01:09
是什麼數據看起來像這裏是你可以剪切和粘貼的一小段數據。注意:它是所有相同的ID,我有不同的起始日期5點不同的ID /次
structure(list(COLLAR_ID = c(2159L, 2159L, 2159L, 2159L, 2159L,
2159L, 2159L, 2159L, 2159L, 2159L, 2159L, 2159L, 2159L, 2159L,
2159L, 2159L, 2159L, 2159L, 2159L, 2159L), dt = structure(c(1138366975,
1138370472, 1138374064, 1138377669, 1138381264, 1138384873, 1138388503,
1138399312, 1138402842, 1138406507, 1138413700, 1138417261, 1138420848,
1138424444, 1138428071, 1138431695, 1138435287, 1138438938, 1138442428,
1138446098), class = c("POSIXct", "POSIXt"), tzone = "GMT")), .Names = c("COLLAR_ID",
"dt"), class = "data.frame", row.names = c(NA, 20L))
所以我認爲,從數據。例如,如果我的開始日期是2006-01-27 00:00: 00時間,那麼它應該記錄的下一個位置是在12:00:00 - 但是這個位置不存在,所以它應該記錄13:02:55。但即使如此,這也是2分鐘內嚴格的1小時緩衝時間窗口。
我曾想過將日期時間轉換爲Julian十進制數以便更容易處理,但我不知道該怎麼做。將日期/時間舍入到幾個小時就沒關係,除了有時在1小時的時間間隔內有2或3個位置,所以我需要在那些與原始啓動「最接近的時間」的位置中進行選擇。
因此,添加新的細節可能會使事情變得更加令人困惑 - 一些數據最初每隔1小時收集一次,然後3周後它會切換到12小時。但是,我不知道每個人都應該切換的編程時間。其他人從12點開始00:00:00開始,但每隔1小時切換一次,然後在幾天後切換到12小時 - 但又不知道切換的時間。所以,它可能會從下午2點開始轉爲12小時。
我想看看this stack overflow conversation,但看不到如何工作。所以,這是我下面的嘗試,我現在已經從原始發佈的問題更新了。這是行不通的。我仍在努力......它仍然看起來相當笨拙的代碼。
test2 = test2[order(test2$COLLAR_ID,test2$dt),]
test2$dt <- as.POSIXct(strptime((test2$dt), "%Y-%m-%d %H:%M:%S"), tz="GMT")
MinInterval = 12 #minimum time interval (in hours) between consecutive locations
row = 0 # Keeps track of row within alldata
Endtest2 = 2 #keeps track of row within individual within all data
SubData1 = test2[1,]
IDNames = levels(as.factor(test2$COLLAR_ID))
test22 = data.frame()
for (n in 1:length(IDNames)){
IndivData = test2[test2$COLLAR_ID==IDNames[n],]
row = row+1 #Continues to track next row between individuals
Endtest2 = 2 #restarts counting the rows for NEXT individual
SubData1[row,]=IndivData[1,]
while (Endtest2<nrow(IndivData)){
timediff = difftime(IndivData$dt[Endtest2],SubData1$dt[row],units = "hours")
if (timediff>MinInterval){ #If time difference is greater than 47 hours then do
row = row+1
SubData1=rbind(SubData1,IndivData[Endtest2,])
Endtest2 = Endtest2+1
} else{
Endtest2 = Endtest2+1
}
} #end while loop
} #end loop through individuals
test22 =SubData1
} #end conditional to subset data
我道歉,不好意思地說,我完全忘了我這個posted a question(使用類似的代碼)長回來,但從來沒有得到任何解決方案。我已經放棄了整個努力,但現在正在用新數據(更多混沌數據)和新需求重新審視它。該腳本不會過濾出正確的數據。
答案是否適合您?它似乎確實如此。如果是這樣,請將其標記爲已回答。 – BrodieG