滚动加入 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 和来自 dt1
和 dt2
的所有 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]
会忽略来自 dt1
或 dt2
的键。
有没有更简单的方法?
P.S。旁注 - 是否还有一种更简单的方法可以从一开始就使用 data.table
函数创建键控 data.table
,而无需使用 setkey?
您可以将 merge
与 all=T
一起使用,将 setnafill
与 type='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
假设在 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 和来自 dt1
和 dt2
的所有 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]
会忽略来自 dt1
或 dt2
的键。
有没有更简单的方法?
P.S。旁注 - 是否还有一种更简单的方法可以从一开始就使用 data.table
函数创建键控 data.table
,而无需使用 setkey?
您可以将 merge
与 all=T
一起使用,将 setnafill
与 type='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