如何在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
相关产品推荐
相关产品推荐

