滚动加入 data.table 中的两个时间序列

rolling join two time series in data.table

假设在 data.table 中有两个异步时间序列:

dt1 = setkey(data.table(k = 2*(1:4) + 1, v = c(10, 15, 9, 7)), k)
dt2 = setkey(data.table(k = 2*(1:3), v = c(11, 13, 6)), k)

我想要的输出是使用 LOCF 和来自 dt1dt2 的所有 k 值将它们合并到 k 列,如下所示:

> out
k v i.v
2 NA 11
3 10 11
4 10 13
5 15 13
6 15 6
7 9  6
9 7  6

目前,我使用的结构有点笨拙:

all_keys = setkey(data.table(k = sort(c(dt1[, k], dt2[, k])), k)
dt1[all_keys, roll = T, on = 'k'][
    dt2[all_keys, roll = T, on = 'k']]

这可行,但感觉有点做作。请注意,简单滚动 dt1[dt2, roll = T]dt2[dt1, roll = T] 会忽略来自 dt1dt2 的键。 有没有更简单的方法?

P.S。旁注 - 是否还有一种更简单的方法可以从一开始就使用 data.table 函数创建键控 data.table,而无需使用 setkey?

您可以将 mergeall=T 一起使用,将 setnafilltype='locf' 一起使用:

setnafill(merge(dt1,dt2,all=T),type="locf")[]

Key: <k>
       k   v.x   v.y
   <num> <num> <num>
1:     2    NA    11
2:     3    10    11
3:     4    10    13
4:     5    15    13
5:     6    15     6
6:     7     9     6
7:     9     7     6