Я пытаюсь найти способ обойти эту функцию запроса: [# 2300] Добавьте backwards и firstback к roll = TRUE, который был упомянут в этот пост.
В основном я хотел бы выполнить следующее "оконное соединение" 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 ...