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

基于不同时间起点应用cumsum()计算累积值达标时间

解决个体特定阈值下累积值达标时间的计算问题

嘿,我懂你现在要解决的问题了——针对每个个体,从他们专属的时间阈值p开始,计算累积t里的数值达标vals中各个水平需要多少时间单位。你当前用循环+findInterval()的思路完全没问题,我来给你梳理下具体的实现细节,还可以给你点优化建议:

先明确示例数据(方便你对应自己的场景)

假设我们的基础数据是这样的:

  • t:按时间顺序排列的数值向量,每个元素对应一个时间单位的观测值
  • vals:我们要监测的累积值达标水平
  • individuals:包含个体ID和对应时间阈值p的数据框(这里的p指的是t向量中的起始索引,你可以根据实际情况换成时间点数值)
# 示例数据
t <- c(2, 3, 1, 4, 5)
vals <- c(5, 10, 15)
individuals <- data.frame(id = 1:3, p = c(2, 1, 3))

基础循环实现(和你当前的做法对齐)

这是和你思路完全匹配的循环写法,逻辑清晰,适合理解每个步骤:

# 初始化结果存储矩阵
result <- matrix(NA, nrow = nrow(individuals), ncol = length(vals))
colnames(result) <- paste0("time_to_", vals)
rownames(result) <- individuals$id

# 逐个个体计算
for (i in seq(nrow(individuals))) {
  # 获取当前个体的起始位置
  start_idx <- individuals$p[i]
  # 提取从阈值开始的子向量
  t_sub <- t[start_idx:length(t)]
  # 计算累积和
  cum_t <- cumsum(t_sub)
  
  # 针对每个达标值计算所需时间单位
  time_units <- sapply(vals, function(val) {
    idx <- findInterval(val, cum_t)
    # 分情况处理:
    if (idx == 0) {
      # 第一个时间单位的累积值就达标
      1
    } else if (idx == length(cum_t)) {
      # 所有时间的累积值都没达标,返回NA
      NA
    } else {
      # 找到第一个超过达标值的位置,对应的时间单位
      idx + 1
    }
  })
  
  result[i, ] <- time_units
}

# 转成更直观的数据框
result_df <- cbind(individuals, as.data.frame(result))
print(result_df)

更简洁的向量化实现(用purrr)

如果想摆脱显式循环,用purrr的函数式编程风格会更简洁,代码可读性也不错:

library(purrr)
library(dplyr)

# 逐个处理个体,返回结果列表后合并
result_list <- pmap(individuals, function(id, p) {
  t_sub <- t[p:length(t)]
  cum_t <- cumsum(t_sub)
  
  time_units <- sapply(vals, function(val) {
    idx <- findInterval(val, cum_t)
    if (idx == 0) 1
    else if (idx == length(cum_t)) NA
    else idx + 1
  })
  
  # 返回当前个体的结果行
  data.frame(id, p, as.list(time_units))
})

# 合并列表为数据框并调整列名
result_df <- bind_rows(result_list)
colnames(result_df)[3:ncol(result_df)] <- paste0("time_to_", vals)
print(result_df)

几个关键注意点

  • 时间阈值的定义:如果你的p不是t的索引,而是具体的时间点数值,那需要先找到t中对应时间点的位置(比如用findInterval(p, time_points),其中time_points是和t对应的时间向量)
  • 达标逻辑调整:如果你的需求是累积和刚好等于达标值就算完成,那可以在判断里加if (cum_t[idx] == val) idx else idx +1,根据实际业务场景调整
  • 非等间隔时间:如果t对应的时间单位不是固定1,那需要用对应的时间点向量计算实际时长,比如time_points[start_idx + time_units - 1] - time_points[start_idx]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:46:19