查找最近的观察结果 - R

时间:2015-07-17 14:19:43

标签: r

我有两组(已排序)POS​​IXct时间序列,如下所示:

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

1 个答案:

答案 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