基于data.table实现带条件的Value列累加计算求助
基于data.table的条件求和实现
问题背景
我有一个包含三列的data.table:
Start_time:某流程的开始时间Time:实际时间点Value:对应时间点的流程数值
示例数据生成代码:
library(data.table) library(dplyr) Start_number <- 3 Duration <- 4 Table <- rbindlist(lapply(seq_len(Start_number),function(x) data.table(Start_time = x, Time = as.integer(x + seq_len(Duration) - 1)) %>% mutate(Value = 2)))
注:实际数据中Value列值会变化。
需求说明
需要生成包含以下两列的输出表:
Time:按从小到大排列的所有唯一时间值Total_FV:对Value列按以下规则求和:- 仅对**
Time大于当前行Time**的行求和 - 同时排除**
Start_time大于当前行Time**的行
- 仅对**
目标输出示例:
Target_output <- data.table(Time = seq(1,6), Total_FV = c(6,10,12,6,2,0))
尝试过的错误方法
我尝试用自连接的非等连接方式实现,但结果不符合预期:
Result <- Table[Table,on = .(Start_time >= Time,Time > Time),.(Total_FV = sum(Value)),by = Time]
解决方案(优先连接方法)
步骤1:生成包含所有唯一时间的基础表
首先提取原表中所有唯一的时间值并排序,作为结果的时间维度:
dt_times <- data.table(Time = sort(unique(Table$Time)))
步骤2:非等连接+分组求和
通过data.table的非等连接,匹配符合条件的行并按每个时间点求和:
# 左连接原表,匹配满足条件的行并求和 result <- dt_times[Table, on = .(Time < Time, Time >= Start_time), .(Total_FV = sum(Value)), by = .EACHI] # 补全无匹配项的时间点,将NA替换为0 result <- dt_times[result, on = .(Time)] result[is.na(Total_FV), Total_FV := 0]
代码说明
- 连接条件
on = .(Time < Time, Time >= Start_time):- 第一个
Time是左表(dt_times)的时间,第二个Time是右表(Table)的时间,Time < Time确保只匹配右表中时间大于当前行的记录 Time >= Start_time确保右表中流程的开始时间不晚于当前行时间,满足排除条件
- 第一个
by = .EACHI表示按左表的每一行单独计算求和结果- 最后通过左连接补全所有时间点,并将无匹配项的求和结果设为0,与目标输出一致
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

