首页 > 解决方案 > 什么是找到数据集与参考(更大)数据集的最接近时间的有效编程方法

问题描述

与大型数据集 (a) 相比,我正在寻找一种有效的方法来查找小型数据集 (x) 的最接近时间。结果必须是 (a) 长度的索引。我已经创建了一个非常好用的函数,但是,它对于大数据绝对没用,因为它需要几天的时间来处理。

Here is my function: function(x, a, which = TRUE,na.rm=FALSE){
  if("POSIXt" %in% class(x)) x <- as.numeric(x)
  if("POSIXt" %in% class(a)) a <- as.numeric(a)
  sapply(a, function(y) DescTools::Closest(x, y, which = TRUE,na.rm=FALSE)[1])
}

数据集 x 和 a 都被过滤,因此没有一致的时间 stemp,但它们在相同的要求之后被过滤。

向量 a 包含 20 Hz 数据,长度为 16020209,x 包含 30 秒数据,长度为 26908。

任何建议都非常感谢!谢谢 :)

标签: rquicksortlarge-dataclosest

解决方案


可以使用来自以下位置的滚动连接data.table

library(data.table)
set.seed(1)  # reproduciblity on Stackoverflow
DF_A <- data.table(x = seq(-500, by = 0.5, length.out = 26908),
                   idx = seq_len(26908))

DF_HZ <- data.table(x = round(runif(16020209, first(DF_A$x), last(DF_A$x)), 3),
                    idx_hz = seq_len(16020209))

DF_HZ[, x_hz := x + 0] # so we can check
DF_A[, x_a := x + 0] # so we can check


setkey(DF_A, x)
setkey(DF_HZ, x)

# The order(idx_hz) returns the result in the same order as 
# DF_HZ but it is not necessary to match joins.
DF_A[DF_HZ, roll = "nearest"][order(idx_hz)]
#>                   x   idx     x_a   idx_hz      x_hz
#>        1:  3072.021  7145  3072.0        1  3072.021
#>        2:  4506.369 10014  4506.5        2  4506.369
#>        3:  7206.883 15415  7207.0        3  7206.883
#>        4: 11718.574 24438 11718.5        4 11718.574
#>        5:  2213.328  5428  2213.5        5  2213.328
#>       ---                                           
#> 16020205: 10517.477 22036 10517.5 16020205 10517.477
#> 16020206: 11407.776 23817 11408.0 16020206 11407.776
#> 16020207: 12051.919 25105 12052.0 16020207 12051.919
#> 16020208:  3482.463  7966  3482.5 16020208  3482.463
#> 16020209:   817.366  2636   817.5 16020209   817.366

reprex 包(v0.3.0)于 2020 年 11 月 11 日创建

在我的机器上,以上(不包括创建虚拟数据)大约需要 3 秒。


推荐阅读