library(magrittr)
library(data.table)
Sys.setlocale(locale = "cht") # windows OS
d <-
  fread(
    "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
