1

我遇到了很多关于窗口连接的帖子

  1. 滚动中位数
  2. 滚动回归

由于 data.table1.8.8roll参数,我的理解是我们可以做这些事情。假设我们有X并且Y使用相同的键说x,y,t,我们希望能够获得每一行X

where 的所有行都与 AND whereYx,yY匹配XX$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

我的问题是:

  1. 我认为以前无法​​轻松实现窗口连接是否正确roll
  2. 如果我们想要X$t in ]Y$t-w1,Y$t+w2[(不再是紧凑集),我们可以解决 pb 吗?
4

0 回答 0