说我有一个data.table看起来如下:data.table:子集在过去24小时的观察,每组
dt = data.table(group = c(1,1,1,2,2,2,3,3,3),time = c("2016-03-09T08:31:00-05:00","2016-03-08T11:31:00-05:00","2016-03-06T08:31:00-05:00",
"2016-04-04T23:28:00-04:00","2016-04-10T23:28:00-04:00","2016-04-09T23:28:00-04:00",
"2016-05-11T19:52:00-04:00","2016-05-10T20:52:00-04:00","2016-04-11T19:52:00-04:00"))
dt
group time
1: 1 2016-03-09T08:31:00-05:00
2: 1 2016-03-08T11:31:00-05:00
3: 1 2016-03-06T08:31:00-05:00
4: 2 2016-04-04T23:28:00-04:00
5: 2 2016-04-10T23:28:00-04:00
6: 2 2016-04-09T23:28:00-04:00
7: 3 2016-05-11T19:52:00-04:00
8: 3 2016-05-10T20:52:00-04:00
9: 3 2016-04-11T19:52:00-04:00
对于每个组在此data.table,我想只保留在最近日期的24小时内的观测值。我为此制作了一个令人讨厌的解决方案,但它并不像我需要它在大型数据集上那么快。
library(lubridate)
set(dt,j = "time",value = ymd_hms(dt[["time"]]))
dt[,.(mostRecent = max(time),time),by = group][
time > (mostRecent - days(1)),.(group,time)]
group time
1: 1 2016-03-09 13:31:00
2: 1 2016-03-08 16:31:00
3: 2 2016-04-11 03:28:00
4: 3 2016-05-11 23:52:00
5: 3 2016-05-11 00:52:00
有没有人有如何完成更优雅/更快的提示?
我很困惑all_times_int。那些仍然是某种意义上的时代? – Frank
AFAIK您可以将时间(以秒为单位)转换为'整数',只需从某个起点开始计算秒数。如果你关心时间差异,你可以简单地使用'整数',因为你不关心实际的'YYYY-mm-dd HH:MM:SS'表示......使用'integer'可以比使用' POSIX'。也许有更多经验的人可能会说'data.table :: IDateTime' ... – sbstn
好的,谢谢,听起来像你失去了毫秒和一个很好的表示。 – Frank