滚动连接R中的data.table

时间:2012-08-19 23:59:21

标签: r join time-series 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.table,其中dt2中的值会被滚动:

dt1[dt2,roll=TRUE]

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

dt2[dt1,roll=TRUE]

有人可以向我解释更多关于加入data.table的方式,因为我显然没有正确理解它。我认为dt1[dt2,roll=TRUE]对应于select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t)的sql等效,除了增加的功能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=Tiddt1中不存在特定{{1}}的情况怎么办?多玩一点,我无法理解列中放置了什么值。

1 个答案:

答案 0 :(得分:25)

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

  

roll适用于上一个连接列,通常是日期,但可以是任何日期   有序变量,不规则且包括间隙。如果roll = TRUE且我是   行匹配除了最后一个x连接列之外的所有列,以及它的值   最后我加入专栏落在一个缺口(包括在最后一个之后)   在x中观察该组),然后x中的主导值是   向前滚动。使用修改后的操作特别快   二分搜索。该操作也称为最后进行的观察   前进(LOCF)。通常,x的键中不应有重复项   最后一个键列是日期(或时间或日期时间)和所有列   x的键加入了。一个常见的习语是选择一个   跨越一组标识符的同期常规时间序列(dts)   (ids):DT [CJ(ids,dts),roll = TRUE]其中DT有一个2列密钥(id,date)   和CJ代表交叉加入。

  

rolltolast和roll一样,但是数据没有滚过最后一个   由连接列定义的每个组内的观察。价值   我必须落入x的间隙,但不是在数据结束之后   除最后一个连接列以外的所有组定义的组。滚和   rolltolast可能都不是真的。

就SQL连接的左/右类比而言,我更倾向于在FAQ 2.14 的上下文中考虑这个问题。您能否进一步解释为什么data.table受A [B]语法的启发 在基地。这是一个相当长的答案,所以我不会在这里粘贴它。