基于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
相关产品推荐
相关产品推荐

