使用data.table区间连接时保留原date列的方法
使用data.table实现按组区间连接并保留原日期值
首先构造可复现的示例数据:
library(data.table) # 分组时间区间表 df <- data.table( group = c("A", "A", "B"), start = as.Date(c("2023-01-01", "2023-02-01", "2023-01-01")), end = as.Date(c("2023-01-15", "2023-02-28", "2023-01-31")), value = c(10, 20, 30) ) # 待匹配日期表 df_dates <- data.table( group = c("A", "A", "B", "B"), date = as.Date(c("2023-01-05", "2023-02-10", "2023-01-20", "2023-02-05")) )
问题原因
如果直接使用df_dates[df, on = .(group, date >= start, date <= end)],data.table会将连接条件中的date >= start替换为左表的date列值等于右表的start,导致结果中的date被覆盖为start的值,丢失原日期。
正确实现方式
通过明确引用左表(df_dates)的原日期列(x.date),在连接后保留该值:
# 按组匹配区间,保留df_dates的原date列 result <- df_dates[df, on = .(group, date >= start, date <= end), nomatch = 0, # 过滤不匹配区间的记录 .(group, date = x.date, start, end, value)]
输出结果
print(result) # group date start end value # 1: A 2023-01-05 2023-01-01 2023-01-15 10 # 2: A 2023-02-10 2023-02-01 2023-02-28 20 # 3: B 2023-01-20 2023-01-01 2023-01-31 30
核心要点
- 用
x.前缀引用左表(df_dates)的列,避免被连接条件覆盖 nomatch = 0用于剔除不在任何区间内的日期记录- 连接条件
.(group, date >= start, date <= end)确保按组匹配时间区间
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

