滚动连接R中的data.table

Ale*_*lex 43 join r 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")
Run Code Online (Sandbox Code Playgroud)

我希望这会生成一个long data.table,其中值为dt2:

dt1[dt2,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)

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

dt2[dt1,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释更多关于如何加入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.
Run Code Online (Sandbox Code Playgroud)

这使得似乎只返回X中的内容,正在进行的连接是内连接,而不是外连接.roll=T那个什么时候但那个特别id不存在dt1?多玩一点我无法理解列中放置了什么值.

Mat*_*wle 26

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

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

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

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

  • `rolltolast`在v1.9.6中被`rollends`取代.:`'rolltolast'自2013年3月3日CRAN上的v1.8.8起被标记为'弃用',参见NEWS.请改为更灵活的'rollends'.'rolltolast'将在下一个版本中删除 (4认同)
  • @swihart +1谢谢。您可以直接编辑答案的任何机会都会更快。 (2认同)