fork download
  1. library(magrittr)
  2. library(data.table)
  3. Sys.setlocale(locale = "cht") # windows OS
  4. d <-
  5. "id date time sth
  6. 個體A 2012/10/11 20:00 實驗資料OOXX
  7. 個體A 2012/10/11 23:00 實驗資料OOXX
  8. 個體A 2012/10/12 03:00 實驗資料OOXX
  9. 個體B 2012/12/11 05:00 實驗資料OOXX
  10. 個體B 2012/12/11 11:05 實驗資料OOXX
  11. 個體B 2012/12/11 13:00 實驗資料OOXX
  12. 個體B 2012/12/11 18:00 實驗資料OOXX
  13. 個體B 2012/12/11 20:00 實驗資料OOXX"
  14. )
  15. # 定義日期時間欄位
  16. d[, datetime := paste(date, time) %>% as.POSIXct()]
  17.  
  18. # 先按 id 再按 datetime 排序
  19. setorder(d, id, datetime)
  20.  
  21. # 在各 id 之內,計算所有 datetime 的兩兩距離(秒),以 complete 法分群,
  22. # 以大於 6 小時(即 10800 秒)當不同群切點,
  23. # 在 group 欄記錄結果。
  24. # h 故意加上一個小正數是為了使正好 7 小時的情況仍在同一組
  25. d[, group :=
  26. datetime %>%
  27. dist %>%
  28. hclust(method = "complete") %>%
  29. cutree(h = 7 * 60 * 60 + 0.0001), by = id]
  30. d
  31. # id date time sth datetime group
  32. # 1: 個體A 2012/10/11 20:00 實驗資料OOXX 2012-10-11 20:00:00 1
  33. # 2: 個體A 2012/10/11 23:00 實驗資料OOXX 2012-10-11 23:00:00 1
  34. # 3: 個體A 2012/10/12 03:00 實驗資料OOXX 2012-10-12 03:00:00 2
  35. # 4: 個體B 2012/12/11 05:00 實驗資料OOXX 2012-12-11 05:00:00 1
  36. # 5: 個體B 2012/12/11 11:05 實驗資料OOXX 2012-12-11 11:05:00 2
  37. # 6: 個體B 2012/12/11 13:00 實驗資料OOXX 2012-12-11 13:00:00 2
  38. # 7: 個體B 2012/12/11 18:00 實驗資料OOXX 2012-12-11 18:00:00 3
  39. # 8: 個體B 2012/12/11 20:00 實驗資料OOXX 2012-12-11 20:00:00 3
  40.  
  41. # 在各 id 及各 group 內取最後一列
  42. d[, .SD[.N,], by = .(id, group)]
  43. # id group date time sth datetime
  44. # 1: 個體A 1 2012/10/12 03:00 實驗資料OOXX 2012-10-12 03:00:00
  45. # 2: 個體B 1 2012/12/11 05:00 實驗資料OOXX 2012-12-11 05:00:00
  46. # 3: 個體B 2 2012/12/11 13:00 實驗資料OOXX 2012-12-11 13:00:00
  47. # 4: 個體B 3 2012/12/11 20:00 實驗資料OOXX 2012-12-11 20:00:00
  48.  
Success #stdin #stdout #stderr 0.34s 43380KB
stdin
Standard input is empty
stdout
[1] ""
      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     1
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       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
stderr
Warning message:
In Sys.setlocale(locale = "cht") :
  OS reports request to set locale to "cht" cannot be honored