在R中滚动连接data.table

我想了解更多有关滚动连接工作的方式,并且有一些困惑,我希望有人能够为我澄清这一点。 举一个具体的例子:

dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t") dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t") 

我期望这将产生一个长的data.tabledt2的价值滚动:

 dt1[dt2,roll=TRUE] 

相反,正确的做法似乎是这样的:

 dt2[dt1,roll=TRUE] 

有人可以向我解释更多关于如何joindata.table作品,因为我显然不能正确理解它。 我认为dt1[dt2,roll=TRUE]对应于select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t) sql的等价物,除了添加了locffunction。

另外文档说:

 X[Y] is a join, looking up X's rows using Y (or Y's key if it has one) as an index. 

这使得似乎只有X中的东西应该被返回,所做的连接是一个内部连接,而不是外部连接。 如果roll=T但是dt1中不存在特定的id ,那么情况如何呢? 玩了一会儿,我不明白什么价值被列入列。

文档中的引用来自FAQ 1.12 X [Y]和merge(X,Y)之间有什么区别 。 你有没有在?data.tablefind以下内容?

roll适用于最后一个join列,通常是一个date,但可以是任何有序variables,不规则和包括间隙。 如果roll = TRUE且i行与除最后一个x连接列以外的所有行匹配,并且它在最后一个连接列中的值落在一个间隙中(包括在该组中的最后一次观察之后),则x中的主要值是向前滚动。 使用修改的二进制search,此操作特别快速。 该操作也被称为最后的观察结果(LOCF)。 通常,x的键中不应该有重复项,最后一个键列是date(或时间或date时间),并且x的键的所有列都被连接到。 一个常见的习惯用法是在一组标识符(ID)中select一个同时期的规则时间序列(dts):DT [CJ(id,dts),roll = TRUE]其中DT有一个2列键(id,date) CJ代表交叉连接。

rolltolast与滚动类似,但是数据不会向前滚动,超过连接列定义的每个组中的最后一个观察值。 i的值必须落在x中的一个空格中,但不是在数据结束之后,对于除最后一个join列之外的所有其他字段定义的组。 roll和rolltolast可能都不是TRUE。

根据与SQL连接的左/右类比,我更喜欢在FAQ 2.14的背景下思考这个问题。你能否进一步解释为什么data.table受基于A [B]语法的启发 。 这是一个相当长的答案,所以我不会粘贴在这里。