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

基于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列值会变化。

需求说明

需要生成包含以下两列的输出表:

  1. Time:按从小到大排列的所有唯一时间值
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:36:27