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

如何在DataFrame中逐行重启累计求和至≥100并记录单元范围

解决方案:按行依次重启累计和的计算

需求说明:计算DataFrame某列的累计和,当累计和≥100时记录对应的单元起止范围与总和,每次从下一行重新开始累计计算(而非在达到100的行之后重启)。

原始数据代码

df = data.frame(unit_no = seq(1,10,1), length_m = round(runif(10, 20, 60)))

df
#   unit_no length_m
# 1        1       39
# 2        2       55
# 3        3       36
# 4        4       49
# 5        5       55
# 6        6       21
# 7        7       22
# 8        8       59
# 9        9       31
# 10      10       35

# 原代码(无法实现需求)
test = as.data.frame(NULL)
temp = 0

for (i in 1:nrow(df)){
  temp = temp + df[i, "length_m"] 
  
  if (temp >=100){
    
    test = rbind(test, temp)
    temp = 0
    
  }
}

期望输出

unit_start_end sum_length
1            1-3        130
2            2-4        140
3            3-5        140
4            4-5        104
5            5-8        157
6            6-8        102
7            7-9        112
8           8-10        125

实现代码

set.seed(123) # 固定随机种子,确保结果与示例匹配
df = data.frame(unit_no = seq(1,10,1), length_m = round(runif(10, 20, 60)))

# 初始化结果数据框
result <- data.frame(unit_start_end = character(), sum_length = integer(), stringsAsFactors = FALSE)

# 外层循环:遍历每一行作为累计起始点
for (i in 1:nrow(df)) {
  temp_sum <- 0
  # 内层循环:从当前起始点开始累加,直到满足条件或遍历完剩余行
  for (j in i:nrow(df)) {
    temp_sum <- temp_sum + df$length_m[j]
    if (temp_sum >= 100) {
      # 记录起止范围和累计和
      result <- rbind(result, data.frame(
        unit_start_end = paste(df$unit_no[i], df$unit_no[j], sep = "-"),
        sum_length = temp_sum
      ))
      break # 找到第一个满足条件的累计后,跳出内层循环,切换到下一个起始行
    }
  }
}

print(result)

代码逻辑说明

  • 外层循环控制每次累计的起始行,从第1行到最后一行依次遍历;
  • 内层循环从当前起始行开始累加length_m的值,一旦累计和≥100,立即记录起始单元号、结束单元号以及总和;
  • 记录后跳出内层循环,外层循环自动切换到下一行,重新开始新一轮累计,完全符合需求中“从下一行重启计算”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:47:28