我具有對應於狀態變化(例如,光開關翻轉)看起來像這樣記錄的時間戳的大的數據集:轉換時間戳狀態事件日誌中的R data.table運行時
library(data.table)
library(lubridate)
foo <-
data.table(ts = ymd_hms("2013-01-01 01:00:01",
"2013-01-01 05:34:34",
"2013-01-02 14:12:12",
"2013-01-02 20:01:00",
"2013-01-02 23:01:00",
"2013-01-03 03:00:00",
"2013-05-04 05:00:00"),
state = c(1, 0, 1, 0, 0, 1, 0))
而且我試圖(1)以秒爲單位將狀態日誌的歷史轉換爲運行時間,並且(2)將它們轉換爲每日累積運行時間。大部分(但不是全部)時間,連續記錄狀態值交替出現。這是一個糟糕的開始,但它有點短。
foo[, dif:=diff(ts)]
foo[state==1][, list(runtime = sum(dif)), .(floor_date(ts, "day"))]
特別是,當狀態爲「開」期間跨越午夜,這種做法是不夠聰明的東西分裂,並錯誤地報告運行時間超過一天。而且,使用diff
也不是那麼聰明,因爲如果存在連續相同的狀態或者NAs
,它將會出錯。
任何可以正確解析對大型數據集仍然快速高效的運行時的建議?
如何處理狀態具有連續相同值的事件?如何計算運行時間呢? –
如果有連續的狀態值(例如'state = c(1,1,1)',這些都應該被認爲是相同的運行週期,因爲狀態從未真正改變過。 – Bryan