library(magrittr)
library(data.table)
d <-
"id date time sth
個體A 2012/10/11 20:00 實驗資料OOXX
個體A 2012/10/11 23:00 實驗資料OOXX
個體A 2012/10/12 03:00 實驗資料OOXX
個體B 2012/12/11 05:00 實驗資料OOXX
個體B 2012/12/11 11:05 實驗資料OOXX
個體B 2012/12/11 13:00 實驗資料OOXX
個體B 2012/12/11 18:00 實驗資料OOXX
個體B 2012/12/11 20:00 實驗資料OOXX"
)
# 定義日期時間欄位
d
[, datetime
:= paste
(date
, time) %>% as.
POSIXct()]
# 先按 id 再按 datetime 排序
setorder(d, id, datetime)
# 在各 id 之內,計算所有 datetime 的兩兩距離(秒),以 complete 法分群,
# 以大於 6 小時(即 10800 秒)當不同群切點,
# 在 group 欄記錄結果。
# h 故意加上一個小正數是為了使正好 7 小時的情況仍在同一組
d[, group :=
datetime %>%
dist %>%
hclust(method = "complete") %>%
cutree(h = 7 * 60 * 60 + 0.0001), by = id]
d
# id date time sth datetime group
# 1: 個體A 2012/10/11 20:00 實驗資料OOXX 2012-10-11 20:00:00 1
# 2: 個體A 2012/10/11 23:00 實驗資料OOXX 2012-10-11 23:00:00 1
# 3: 個體A 2012/10/12 03:00 實驗資料OOXX 2012-10-12 03:00:00 2
# 4: 個體B 2012/12/11 05:00 實驗資料OOXX 2012-12-11 05:00:00 1
# 5: 個體B 2012/12/11 11:05 實驗資料OOXX 2012-12-11 11:05:00 2
# 6: 個體B 2012/12/11 13:00 實驗資料OOXX 2012-12-11 13:00:00 2
# 7: 個體B 2012/12/11 18:00 實驗資料OOXX 2012-12-11 18:00:00 3
# 8: 個體B 2012/12/11 20:00 實驗資料OOXX 2012-12-11 20:00:00 3
# 在各 id 及各 group 內取最後一列
d[, .SD[.N,], by = .(id, group)]
# id group date time sth datetime
# 1: 個體A 1 2012/10/12 03:00 實驗資料OOXX 2012-10-12 03:00:00
# 2: 個體B 1 2012/12/11 05:00 實驗資料OOXX 2012-12-11 05:00:00
# 3: 個體B 2 2012/12/11 13:00 實驗資料OOXX 2012-12-11 13:00:00
# 4: 個體B 3 2012/12/11 20:00 實驗資料OOXX 2012-12-11 20:00:00