不直观的(?)表连接行为与2个data.tables

问题描述 投票:0回答:1

当使用非等连接连接两个 data.table 时,在我的脑海中,我想象计算机从连接列的顶部到底部查找,直到找到满足连接条件的元素。

library(data.table)

dt1 <- data.table(date = as.Date("2015-01-01"))
dt2 <- data.table(id = 1:4, date = as.Date(c("2014-01-01", "2015-02-01", "2016-01-01", "2017-01-01")))

setorder(dt2, date)

dt1[dt2, on = .(date <= date), `:=`(date2 = i.date, id = i.id)]

在上面的例子中,后连接

dt1
看起来像这样:

         date      date2 id
1: 2015-01-01 2017-01-01  4

令我困惑的是,为什么从

date
加入的
dt2
是满足加入条件的 last 日期(2017-01-01)而不是满足条件的第一个日期(即 2015-02- 01).

我注意到,当您通过运行

dt2
反转
setorder(dt2, -date)
的顺序时,它似乎加入了满足条件的最早日期。

我可以想到两种可行的方法。一种是愚蠢的:计算机从下到上查看表格并选择第一个。第二个是连接算法是贪婪的,它匹配(并随后替换匹配)直到它不再找到满足条件的匹配。

我的问题是后一种行为是否确实是 data.table 的工作方式,如果是的话,除了反转表的顺序之外还有什么方法可以改变这种行为。

r data.table
1个回答
0
投票

从阅读

?:=
的帮助文件来看,看起来第二个选项就是完成的。 我的理由基于“详细信息”部分中的这一陈述:

“.Last.updated”变量包含更新的行数 最近的 ':=' 或 'set' 调用,这可能有用,例如 例如,在生产环境中测试有关的假设 受语句影响的行数;请参阅“.Last.updated” 详细信息。

在问题中显示的代码显示后检查此变量:

dt1[dt2, on = .(date <= date), `:=`(date2 = i.date, id = i.id)]
.Last.updated
#[1] 3

因此,尽管最终输出中仅更改了 1 行,但仍更新了 3 行。

© www.soinside.com 2019 - 2024. All rights reserved.