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

基于df1起止日期用df2变量求和生成新变量时代码异常求助

日期区间内数值求和问题的解决建议

我在Stack Overflow上找到了@akrun针对《Sum variable between dates in R?》问题的首个答案,原本以为这正是我需要的方案,但运行代码时,并未得到df1日期区间内df2的value列求和结果,反而得到了区间内的最后一个值。

示例数据

df1 <- data.frame(Start = as.Date(c('1/1/20', '5/1/20', '10/1/20', '2/2/21', '3/20/21'),"%m/%d/%y"), 
                  End = as.Date(c('1/7/20', '5/7/20', '10/7/20', '2/7/21', '3/30/21'),"%m/%d/%y"))
            
df2 <- data.frame(Date = as.Date(c('1/1/20','1/3/20' ,'5/1/20','5/2/20','6/2/20' ,'6/4/20','10/1/20', '2/2/21', '3/20/21'),"%m/%d/%y"),
                  value=as.numeric(c('1','2','5','15','20','2','3','78','100')))

原代码(未得到预期结果)

setDT(df1)[df2, value := sum(value), 
           on = .(Start <= Date, End >= Date), by = .EACHI]

问题原因

原代码的连接方向是df1[df2],这会让df2的每一行记录去匹配df1的区间,再按每个匹配的df2行分组(by = .EACHI),此时sum(value)本质是对单个值求和,最终结果自然是区间内最后一个匹配到的df2记录值,而非整个区间的求和。

修正方案

方案1:调整连接逻辑,按df1区间分组求和

library(data.table)
setDT(df1)
setDT(df2)

# 按df1的每个区间,匹配df2中符合条件的记录并求和
df1[, value := df2[df1, sum(value, na.rm = TRUE), 
                   on = .(Date >= Start, Date <= End), 
                   by = .EACHI]$V1]

方案2:用%between%运算符按行筛选求和

library(data.table)
setDT(df1)
setDT(df2)

# 对df1的每一行,筛选df2中Date在Start和End之间的记录并求和
df1[, value := df2[Date %between% .(Start, End), sum(value)], by = .I]

预期结果

运行修正后的代码后,df1的value列会得到对应区间的求和结果:

  • 1/1/20 - 1/7/20:1+2=3
  • 5/1/20 - 5/7/20:5+15=20
  • 10/1/20 - 10/7/20:3
  • 2/2/21 - 2/7/21:78
  • 3/20/21 - 3/30/21:100

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:15:32