Опитвам се да намеря начин да заобиколя тази функция за заявка: [#2300] Добавете обратно и първо обратно към roll=TRUE, което беше споменато в тази публикация.
По принцип бих искал да изпълня следното "window-join" на X
, търсейки в Y
- ляво съединяване на първите n колони (в следващия пример
{x,y}
) - И изберете стойности на последна колона (
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...