我有两组(已排序)POSIXct时间序列,如下所示:
set.seed(123)
ll = sort(strptime("16/07/2015", format="%d/%m/%Y") + 10*3600 + 1:3600 + round(rnorm(3600), digits=3))
tt = sort(strptime("16/07/2015", format="%d/%m/%Y") + 10.2*3600 + 1:180*10 + round(rnorm(180), digits=3))
tplus = 0:180
其中ll
实际上有10 ^ 5个观测值,tt
10 ^ 3 - 10 ^ 4且tplus
长度为10 ^ 3。从tt
开始,我为tt1
中的每个观察点添加tplus
来构建时间戳tt
矩阵:
tt1 = t(sapply(tt, function(x) x+tplus))
对于这些时间戳中的每一个,我想知道ll
的最新观察结果(作为ll
的索引)。我可以将其计算为:
tt2 = apply(tt1, c(1,2), function(x) max(which(ll <= x)))
但这很慢,我必须做这种计算大约10 ^ 3次,所以我怎样才能加快速度呢?鉴于ll
已排序且tt1
沿列和行排序,我希望可能存在某些内容。
在这里查看数据:
> head(ll)
[1] "2015-07-16 10:00:00.440 CEST" "2015-07-16 10:00:01.769 CEST" "2015-07-16 10:00:04.071 CEST" "2015-07-16 10:00:04.559 CEST"
[5] "2015-07-16 10:00:05.128 CEST" "2015-07-16 10:00:06.734 CEST"
> head(tt1[,1:4])
[,1] [,2] [,3] [,4] ...
[1,] 1437034330 1437034331 1437034332 1437034333
[2,] 1437034341 1437034342 1437034343 1437034344
[3,] 1437034350 1437034351 1437034352 1437034353
[4,] 1437034359 1437034360 1437034361 1437034362
[5,] 1437034371 1437034372 1437034373 1437034374
[6,] 1437034381 1437034382 1437034383 1437034384
预期的产出:
> head(tt2)
[,1] [,2] [,3] [,4] ...
[1,] 729 729 731 732
[2,] 740 741 742 743
[3,] 748 749 751 752
[4,] 759 760 760 762
[5,] 770 772 773 774
[6,] 780 781 783 785
答案 0 :(得分:4)
只需使用findInterval
:
array(findInterval(tt1,ll),dim(tt1))
#head(array(findInterval(tt1,ll),dim(tt1))[,1:4])
# [,1] [,2] [,3] [,4]
#[1,] 729 729 731 732
#[2,] 740 741 742 743
#[3,] 748 749 751 752
#[4,] 759 760 760 762
#[5,] 770 772 773 774
#[6,] 780 781 783 785