滚动连接R中的data.table

Posted

技术标签:

【中文标题】滚动连接R中的data.table【英文标题】:rolling joins data.table in R 【发布时间】:2012-08-15 09:16:01 【问题描述】:

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

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=T 但那个特定的iddt1 中不存在怎么办?玩得更久了,我无法理解该列中的值是什么。

【问题讨论】:

我写了一篇博文,描述滚动连接的工作原理gormanalysis.com/r-data-table-rolling-joins 【参考方案1】:

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

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

rolltolast 喜欢滚动,但数据没有前滚到最后一个 由连接列定义的每个组内的观察。价值 的 i 必须落在 x 的间隙中,但不是在数据结束之后,因为 该组由除最后一个连接列之外的所有列定义。滚动和 rolltolast 可能不都是 TRUE。

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

【讨论】:

我没看到,谢谢发帖。让我困惑的是 x[y] 返回的行在 y 中但不在 x 中?这似乎不是一个等值连接...特别是 x[y] 和 merge(x, y, all.y=TRUE) 似乎是一样的不? 哦,我明白你的意思了。 nomatch 默认为NA,所以默认为外连接。将“nomatch”设置为 0 以进行内部连接。术语 equi-join 旨在传达 = 出现在(类似的)where 子句中,而不是类似于 &lt;=rollEqui 连接与 innner 连接不同。 此外,为了进一步混淆您,请搜索 ?data.table 以获得 by without by。由于默认情况下mult"all",所以X[Y] 中真正发生的事情是分组,它将Y 中的连接列放入结果中(这就是您认为它从Y 返回行的原因)。一旦你明白这一点,请转到join inherited scope rolltolast 在 v1.9.6 中被 rollends 取代。 : ` 自 2013 年 3 月 3 日 CRAN 的 v1.8.8 以来,“rolltolast”已在 ?data.table 中标记为“已弃用”,请参阅新闻。请改为使用更灵活的“rollends”。 'rolltolast' 将在下一个版本中删除。` @swihart +1 谢谢。您可以直接编辑答案的任何机会都会更快。

以上是关于滚动连接R中的data.table的主要内容,如果未能解决你的问题,请参考以下文章

R语言data.table进行滚动数据连接,滚动联接通常用于分析涉及时间的数据实战(动画说明滚动数据连接的形式):rolling joins data.table in R

R语言data.table进行滚动数据连接,滚动连接通常用于分析涉及时间的数据(例如商业销售活动和对应的广告投放的安排之之间的关系)实战:实战和动画说明滚动数据连接的形式及方法

R语言data.table导入数据实战:data.table进行多表数据连接(mergejoin)内连接左连接外连接

r data.table 围绕 ad-hoc 连接的函数包装器(在链中聚合)

使用 data.table 包滚动平均值到 R 中的多个变量

R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表连接