我正在尝试找到解决此请求功能的方法:[#2300] 向后添加和 firstback 到 roll=TRUE,这在这篇文章中提到。
基本上我想执行以下X
查找的“窗口连接”Y
- 在前 n 列上左连接(在以下示例中
{x,y}
) - AND 选择最后一列(
t
在以下示例中)的值Y
,[t-w1,t+w2]
其中 t 是 中的最后一列X
,通常t
是时间列和{w1,w2}
一些整数(可能是w1=w2=something
或w1=0
)
我构建了以下示例(但随时提供另一个/更好的示例)
library(data.table)
set.seed(123);
X <- data.table(x=c(1,1,1,2,2),y=c(T,T,F,F,F),t=as.POSIXct("08:00:00.000",format="%H:%M:%OS")+sample(0:999,5,TRUE)/1e3)
Y <- copy(X)
set.seed(123)
Y[,`:=`(IDX=.I,t=t+sample(c(-5:5)/1e3,5,T))]
Y <- rbindlist(list(Y, X[5,][,IDX:=6][,t:=t+0.001], X[5,][,IDX:=7][,t:=t+0.002]))
所以随着(w1,w2) = (.002,.002)
R) X R) Y
x y t x y t IDX
1: 1 TRUE 2013-01-25 08:00:00.286 1: 1 TRUE 2013-01-25 08:00:00.284 1
2: 1 TRUE 2013-01-25 08:00:00.788 2: 1 TRUE 2013-01-25 08:00:00.791 2
3: 1 FALSE 2013-01-25 08:00:00.407 3: 1 FALSE 2013-01-25 08:00:00.407 3
4: 2 FALSE 2013-01-25 08:00:00.882 4: 2 FALSE 2013-01-25 08:00:00.886 4
5: 2 FALSE 2013-01-25 08:00:00.940 5: 2 FALSE 2013-01-25 08:00:00.945 5
6: 2 FALSE 2013-01-25 08:00:00.941 6 #by hand
7: 2 FALSE 2013-01-25 08:00:00.942 7 #by hand
结果将是
R) ans
x y t IDX
1: 1 TRUE 2013-01-25 08:00:00.286 1
2: 1 TRUE 2013-01-25 08:00:00.788 NA
3: 1 FALSE 2013-01-25 08:00:00.407 3
4: 2 FALSE 2013-01-25 08:00:00.882 NA
5: 2 FALSE 2013-01-25 08:00:00.940 6,7
但是:IDX
这里很可能是一个列表,如果有几行Y
(可以有比 更多的行X
)匹配,一个只有一个,或者NA
没有匹配。
我也会对一些非 data.table 的答案感到满意......