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

使用data.table实现无重复匹配滚动连接的方法咨询

解决方法

你遇到的问题是data.table滚动近邻匹配时,超出右表日期范围的记录依然会匹配边界值,只需要调整rollends参数限制右端匹配即可,无需额外加辅助列。

最简实现代码

library(data.table)
# 已有的数据集构造代码不变
dt.units <- setDT(structure(list(Tienda = c(55596L, 55596L, 55596L, 55596L), `Bulk no.` = c(9021L, 
9021L, 9021L, 9021L), Date = structure(c(18824, 18894, 18927, 
18955), class = "Date"), Units = c(77L, 36L, 37L, 8L)), row.names = c(NA, 
-4L), class = c("data.table", "data.frame")))

dt.invoices <- setDT(structure(list(TIENDA = c(55596, 55596, 55596), BULTO = c(9021L, 
9021L, 9021L), Date = structure(c(18828, 18894, 18932), class = "Date"), 
    Invoiced = c(77L, 35L, 37L)), row.names = c(NA, -3L), class = c("data.table", 
"data.frame")))

# 设置键
setkeyv(dt.invoices, c("TIENDA", "BULTO", "Date"))
setkeyv(dt.units, c("Tienda", "Bulk no.", "Date"))

# 滚动连接时增加rollends参数限制右端不匹配
dt.data <- dt.invoices[dt.units, roll = "nearest", rollends = c(TRUE, FALSE)]

参数说明

rollends是长度为2的逻辑向量,作用是控制滚动匹配的两端边界行为:

  • 第一个值:当dt.units的日期小于同分组下dt.invoices的最小日期时,是否允许滚动匹配,这里设置为TRUE保留原有的左端匹配逻辑
  • 第二个值:当dt.units的日期大于同分组下dt.invoices的最大日期时,是否允许滚动匹配,这里设置为FALSE,超出的记录对应Invoiced字段会自动返回NA,正好符合需求。

如果需要返回0而不是NA,只需要额外加一行代码即可:

dt.data[is.na(Invoiced), Invoiced := 0]

运行后得到的输出和预期完全一致:

TIENDA BULTO       Date Invoiced Units
1:  55596  9021 2021-07-16       77    77
2:  55596  9021 2021-09-24       35    36
3:  55596  9021 2021-10-27       37    37
4:  55596  9021 2021-11-24       NA     8

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:54:03