根据行时间戳之间的差异,将表中的每一行与另一个表中的行匹配

我有两个不均匀间隔的时间序列,每个时间序列都测量同一系统的不同属性 . 两个系列的数据点不会同时采样,并且系列的长度不同 . 我想将系列A中的每一行与最接近它的B行匹配 . 我想到的是向A添加一列,其中包含B中最近行的索引 . 两个系列都有一个在Unix时间内测量的时间列(例如,1459719755) .

例如,给定两个数据集

a  time
2  1459719755
4  1459719772
3  1459719773

b  time
45 1459719756
2  1459719763
13 1459719766
22 1459719774

第一个数据集应更新为

a  time        index
2  1459719755  1
4  1459719772  4
3  1459719773  4

由于 B[1,]$time 具有与 A[1,]$time 最接近的值,因此 B[4,]$time 具有与 A[2,]$timeA[3,]$time 最接近的值 .

有没有方便的方法呢?

回答(1)

2 years ago

尝试这样的事情:

(1+ecdf(bdat$time)(adat$time)*nrow(bdat))
[1] 1 4 4

为什么要这样做? ecdf函数返回另一个值为0到1的函数 . 它返回由 ecdf 的第一个参数定义的值分布中新值的"probability range" [0,1]中的"position" . 表达式实际上只是重新调整了这个函数's result to the range [1, nrow(bdat)]. (I think it' s翻转优雅 . )

另一种方法是在 bdat$time 的排序值上使用 approxfun ,然后让你得到插值 . 这些可能需要四舍五入 . 将它们用作索引将改为截断为整数 .

apf <- approxfun( x=sort(bdat$time), y=seq(length( bdat$time))  ,rule=2)
apf( adat$time)
#[1] 1.000 3.750 3.875
round( apf( adat$time))
#[1] 1 4 4

在这两种情况下,您都要从“订单统计”中预测排序值 . 在第二种情况下,您应该检查是否以您希望的方式处理关系 .