我有一个矩阵 ,events
其中包含 500 万个事件的发生时间。这 500 万个事件中的每一个都有一个从 1 到 2000 的“类型”。矩阵的一个非常简化的版本如下所示。“时间”的单位是自 1970 年以来的秒。所有事件都发生在 2012 年 1 月 1 日之后。
>events
type times
1 1352861760
1 1362377700
2 1365491820
2 1368216180
2 1362088800
2 1362377700
我试图将自 2012 年 1 月 1 日以来的时间划分为 5 分钟的存储桶,然后用每个存储桶i
中发生的每种类型事件的数量填充每个存储桶。我的代码如下。请注意,这types
是一个包含从 1 到 2000 的每种可能类型的向量,并by
设置为 300,因为这是 5 分钟内的秒数。
for(i in 1:length(types)){
local <- events[events$type==types[i],c("type", "times")]
assign(sprintf("a%d", i),table(cut(local$times, breaks=seq(range(events$times)[1],range(events$times)[2], by=300))))
}
这会产生变量a1
,其中包含一个行向量,该向量表示每个 5 分钟存储桶中有a2000
多少类型的出现。i
然后我继续找到“a1”和“a2000”之间的所有成对相关性。
有没有办法优化我上面提供的代码块?它运行得很慢,但我想不出办法让它更快。也许桶太多,时间太少。
任何见解将不胜感激。
可重现的例子:
>head(events)
type times
12 1308575460
12 1308676680
12 1308825420
12 1309152660
12 1309879140
25 1309946460
xevents <- xts(events[,"type"],.POSIXct(events[,"times"]))
ep <- endpoints(xevents, "minutes", 5)
counts <- period.apply(xevents, ep, tabulate, nbins=length(types))
>head(counts)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
2011-06-20 09:11:00 0 0 0 0 0 0 0 0 0 0 0 1 0 0
2011-06-21 13:18:00 0 0 0 0 0 0 0 0 0 0 0 1 0 0
2011-06-23 06:37:00 0 0 0 0 0 0 0 0 0 0 0 1 0 0
2011-06-27 01:31:00 0 0 0 0 0 0 0 0 0 0 0 1 0 0
2011-07-05 11:19:00 0 0 0 0 0 0 0 0 0 0 0 1 0 0
2011-07-06 06:01:00 0 0 0 0 0 0 0 0 0 0 0 0 0 0
>> ep[1:20]
[1] 0 1 2 3 4 5 6 7 8 9 10 12 20 21 22 23 24 25 26 27
上面是我一直在使用的代码,但问题是它没有增加 5 分钟:它只是随着实际事件的发生而增加。