我正尝试理解`data.table`中的滚动连接(rolling joins)。下面是可用于复现此操作的数据。
假设有一个记录机场交易的`data.table`,记录了某一特定时间的数据:
> dt
t_id airport thisTime
1: 1 a 5.1
2: 3 a 5.1
3: 2 a 6.2
(注意,t_ids
1和3具有相同的机场和时间)
以及一个包含出发机场航班信息的查找表:
> dt_lookup
f_id airport thisTime
1: 1 a 6
2: 2 a 6
3: 1 b 7
4: 1 c 8
5: 2 d 7
6: 1 d 9
7: 2 e 8
> tables()
NAME NROW NCOL MB COLS KEY
[1,] dt 3 3 1 t_id,airport,thisTime airport,thisTime
[2,] dt_lookup 7 3 1 f_id,airport,thisTime airport,thisTime
我希望将所有交易与从该机场出发的所有可能的下一班航班匹配,以得到:
t_id airport thisTime f_id
1 a 6 1
1 a 6 2
3 a 6 1
3 a 6 2
所以我认为这会起作用:
> dt[dt_lookup, nomatch=0,roll=Inf]
t_id airport thisTime f_id
1: 3 a 6 1
2: 3 a 6 2
但它未返回交易t_id == 1
。
根据文档所述:
通常,x的键中不应有重复项,...
然而,在我的“x键”中存在重复项(即airport
和thisTime
),我无法看到/理解为什么会导致t_id = 1
从输出中移除。
有人能否解释一下为什么未返回t_id = 1
,以及当我有重复项时如何使连接正常工作?
数据
library(data.table)
dt <- data.table(t_id = seq(1:3),
airport = c("a","a","a"),
thisTime = c(5.1,6.2, 5.1), key=c( "airport","thisTime"))
dt_lookup <- data.table(f_id = c(rep(1,4),rep(2,3)),
airport = c("a","b","c","d",
"a","d","e"),
thisTime = c(6,7,8,9,
6,7,8), key=c("airport","thisTime"))
ceiling
示例在这种情况下有效,但我预计当dt$thisTime2
的值与它要匹配的dt_lookup$thisTime
值相差超过1
个时间单位时,它可能无法工作,所以我可能需要想出另一种替代方案? - tospig