我有一个大文件的时间序列数据,如下所示。该数据集涵盖年份,以 15 分钟为增量。一个小的子集看起来像:
uniqueid time
a 2014-04-30 23:30:00
a 2014-04-30 23:45:00
a 2014-05-01 00:00:00
a 2014-05-01 00:15:00
a 2014-05-12 13:45:00
a 2014-05-12 14:00:00
b 2014-05-12 13:45:00
b 2014-05-12 14:00:00
b 2014-05-12 14:30:00
要重现上述内容:
time<-c("2014-04-30 23:30:00","2014-04-30 23:45:00","2014-05-01 00:00:00","2014-05-01 00:15:00",
"2014-05-12 13:45:00","2014-05-12 14:00:00","2014-05-12 13:45:00","2014-05-12 14:00:00",
"2014-05-12 14:30:00")
uniqueid<-c("a","a","a","a","a","a","b","b","b")
mydf<-data.frame(uniqueid,time)
我的目标是计算每个连续时间流每个唯一 ID 的行数。连续时间跨度是指每 15 分钟在一行中标记一个唯一 id(例如 id A,从 30.04.14 23.30 hrs 到 01.05.14 00.15 hrs 标记 - 因此是 4 行),但是当这个流为 15 - 分钟迭代被中断(在 01.05.14 00:15 之后,它没有在 01.05.14 00:30 标记,因此它被中断),它应该将下一个时间戳记为新的连续时间流的开始,并再次计算行,直到此流程再次中断。时间是POSIX。
正如你在上面的例子中看到的;连续的时间流可能涵盖不同的日子、不同的月份或不同的年份。我有许多唯一的 id(并且如上所述,一个非常大的文件),所以我正在寻找一种我的计算机可以处理的方式(循环可能不起作用)。
我正在寻找类似的输出:
uniqueid flow number_rows
a 1 4
a 2 2
b 3 2
b 4 1
我研究了一些时间包(例如 lubridate),但鉴于我有限的 R 知识,我什至不知道从哪里开始。
我希望一切都清楚 - 如果没有,我很乐意尝试进一步澄清。非常感谢您提前!
最佳答案
使用 data.table
执行此操作的另一种方法还使用时差将使用 data.table
组号和每组行数的内部值:
library(data.table)
res<-setDT(mydf)[, list(number_rows=.N,flow=.GRP),
by=.(uniqueid,cumsum(as.numeric(difftime(time,shift(time,1L,type="lag",fill=0))) - 15))][,cumsum:=NULL]
print(res)
uniqueid number_rows flow
1: a 4 1
2: a 2 2
3: b 2 3
4: b 1 4
此外,由于您发布的示例数据与您发布的子集不一致,我在下面包含了我的数据:
数据
time<-as.POSIXct(c("2014-04-30 23:30:00","2014-04-30 23:45:00","2014-05-01 00:00:00","2014-05-01 00:15:00",
"2014-05-12 13:45:00","2014-05-12 14:00:00","2014-05-12 13:45:00","2014-05-12 14:00:00",
"2014-05-12 14:30:00"))
uniqueid<-c("a","a","a","a","a","a","b","b","b")
mydf<-data.frame(uniqueid,time)
关于r - 基于多个连续时间流计算行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38231821/