使用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
相关产品推荐
相关产品推荐

