You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R data.table滚动连接生成多余行及引用赋值疑问

data.table滚动连接出现多余行的原因及相关疑问

问题复现

以下是可复现问题的代码:

A <- data.table(id = c(1, 2, 2, 3), 
            dod = as.Date(c('2022-08-01', '2022-01-01', '2022-01-01', '2022-03-01')), 
            sex = c('M', 'F', 'M', 'F'))

B <- data.table(id = c(1, 2, 2, 3, 4, 5), 
            pay_date = as.Date(c('2022-12-01', '2022-01-01', '2022-01-01', '2022-07-01', '2022-08-01', '2022-10-01')), 
            prem = c(100, 150, 120, 80, 160, 180))
A[, roll_date := dod]
B[, roll_date := pay_date]

执行滚动连接命令:

A[B, on = .(id, roll_date), roll = T]

预期输出行数与B一致(6行),但实际得到8行,其中id == 2 & roll_date == '2022-01-01'的所有组合都被输出。

当修改B中id == 2的pay_date为非精确匹配值时,问题消失:

B <- data.table(id = c(1, 2, 2, 3, 4, 5), 
            pay_date = as.Date(c('2022-12-01', '2022-02-01', '2022-02-01', '2022-07-01', '2022-08-01', '2022-10-01')), 
            prem = c(100, 150, 120, 80, 160, 180))

预期输出:

id   pay_date prem  roll_date id_b      dod_b sex_b roll_date_b
1:  1 2022-12-01  100 2022-12-01   NA       <NA>  <NA>        <NA>
2:  2 2022-01-01  150 2022-01-01    2 2022-01-01     F  2022-01-01
3:  2 2022-01-01  120 2022-01-01    2 2022-01-01     F  2022-01-01
4:  3 2022-07-01   80 2022-07-01    3 2022-09-01     M  2022-09-01
5:  4 2022-08-01  160 2022-08-01   NA       <NA>  <NA>        <NA>
6:  5 2022-10-01  180 2022-10-01   NA       <NA>  <NA>        <NA>

问题原因

这是因为滚动连接遇到精确匹配且连接键存在重复值时,data.table会返回所有可能的匹配组合:

  • 你的案例中,A表内id=2且roll_date=2022-01-01有2行,B表内相同条件也有2行,精确匹配时会产生2×2=4行匹配结果,而非预期的1对1匹配。
  • 当修改B的日期为非精确匹配时,滚动逻辑会找到A中roll_date小于等于目标日期的最近一行(此时A中id=2的两行日期相同,只会取其中一行),因此不会产生笛卡尔积式的多余行。

关于引用赋值:=的疑问

引用赋值:=本身和这个问题无关。你用:=创建roll_date列只是常规的列操作,不会影响滚动连接的匹配逻辑。问题的核心是连接键的重复值与精确匹配的组合,而非赋值方式。


内容的提问来源于stack exchange,提问作者Algebro1000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:25:17