我遇到了很多关于窗口连接的帖子
由于 data.table1.8.8
和roll
参数,我的理解是我们可以做这些事情。假设我们有X
并且Y
使用相同的键说x,y,t
,我们希望能够获得每一行X
where 的所有行都与 AND whereY
的x,y
行Y
匹配X
X$t in [Y$t-w1,Y$t+w2]
这是一个例子(w1,w2)=(1,5)
library(data.table)
A <- data.table(x=c(1,1,1,2,2),y=c(F,F,T,T,T),t=c(407,286,788,882,942),key='x,y,t')
X <- copy(A)
Y <- data.table(x=c(1,1,1,2,2,2,2),y=c(F,F,T,T,T,T,T),u=c(417,285,788,882,941,942,945),IDX=1:7,key='x,y,u')
R) X
x y t
1: 1 FALSE 286
2: 1 FALSE 407
3: 1 TRUE 788
4: 2 TRUE 882
5: 2 TRUE 942
R) Y
x y u IDX
1: 1 FALSE 285 2 # match line 1 as (x,y) ok and 285 in [286-1,286+5]
2: 1 FALSE 417 1 # match no line as (x,y) ok against X[c(1,2),] but 417 is too big
3: 1 TRUE 788 3 # match row 3
4: 2 TRUE 882 4 # match row 4
5: 2 TRUE 941 5 # match row 5
6: 2 TRUE 942 6 # match row 5
7: 2 TRUE 945 7 # match row 5
我们不能这样做Y[setkey(X[,list(x,y,t)],x,y,t),roll=1]
,因为如果我们在 (x,y,t) 上完美匹配,data.table 将丢弃与 的潜在部分匹配X$t in [Y$t-w1,X$t[
。
#get the lower bounds and upper bounds for t
X[,`:=`(lowT=t-1,upT=t+5)]
#we get the first line where Y$u >= X$t-1 but Y$u <= X$t+5
X <- setnames(copy(Y),c('u','IDX'),c('lowT','lowIDX'))[setkey(X,x,y,lowT),roll=-6,rollends=T]
#we get the last line where Y$u <= X$t+5 ...
X <- setnames(copy(Y),c('u','IDX'),c('upT','upIDX'))[setkey(X,x,y,upT),roll=6]
#we get the matching IDX
X[!is.na(lowIDX) & !is.na(upIDX), allIDX:=mapply(`seq`,from=lowIDX,to=upIDX)]
R) X
x y upT upIDX lowT lowIDX t allIDX
1: 1 FALSE 291 2 285 2 286 2
2: 1 FALSE 412 NA 406 NA 407
3: 1 TRUE 793 3 787 3 788 3
4: 2 TRUE 887 4 881 4 882 4
5: 2 TRUE 947 7 941 5 942 5,6,7
我的问题是:
- 我认为以前无法轻松实现窗口连接是否正确
roll
? - 如果我们想要
X$t in ]Y$t-w1,Y$t+w2[
(不再是紧凑集),我们可以解决 pb 吗?