45

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

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.table的值dt2滚动:

dt1[dt2,roll=TRUE]

相反,正确的方法似乎是:

dt2[dt1,roll=TRUE]

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

此外,文档说:

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那个特殊id情况不存在,那该dt1怎么办?玩得更多,我无法理解该列中放置了什么值。

4

1 回答 1

29

文档中的引用似乎来自 FAQ 1.12 X[Y] 和 merge(X,Y) 有什么区别。您是否在其中找到以下内容?data.table并有帮助?

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

rolltolast与 roll 类似,但数据不会前滚到连接列定义的每个组中的最后一个观察值之后。对于由除最后一个连接列之外的所有列定义的那个组,i 的值必须落在 x 中的一个间隙中,但不能在数据结束之后。roll 和 rolltolast 可能不会都为 TRUE。

就 SQL 连接的左/右类比而言,我更愿意在 FAQ 2.14 的上下文中考虑这一点,你能进一步解释为什么 data.table 受到 base 中的 A[B] 语法的启发。答案很长,这里就不贴了。

于 2012-08-20T14:36:23.697 回答