基于前值的滚动行减法:计算各重复样本的最终体积
问题:计算累积递减的最终体积
我有一张包含各类参数的表格,每个重复样本(replicate)对应一个体积损失(Volume_loss)。需要新增一列Final_Volume(最终体积),规则如下:
- 第1个样本的最终体积 = 起始体积(start) - 对应体积损失
- 后续样本的最终体积 = 前一个样本的最终体积 - 当前体积损失
数据
replicate=c(1:6) start=c(2982) Volume_loss=c(419.29,450.69,409.73,405.67,367.81,448.61)
当前冗余实现
mutate(Final_Volume= ifelse(replicate=="1", start-Volume_loss, Volume_loss)) mutate(Final_Volume= if_else(replicate!="1", dplyr::lag(Final_Volume)-Volume_loss,Final_Volume)) mutate(Final_Volume= if_else(replicate!=1:2, dplyr::lag(Final_Volume)-Volume_loss,Final_Volume)) mutate(Final_Volume= if_else(replicate!=1:3, dplyr::lag(Final_Volume)-Volume_loss,Final_Volume)) mutate(Final_Volume= if_else(replicate!=1:4, dplyr::lag(Final_Volume)-Volume_loss,Final_Volume)) mutate(Final_Volume= if_else(replicate!=1:5, dplyr::lag(Final_Volume)-Volume_loss,Final_Volume))
预期输出
表格包含replicate、Volume_loss、Final_Volume三列,Final_Volume列的结果依次为:2562.71、2112.02、1702.29、1296.62、928.81、480.20
简洁实现方案
利用cumsum()累积求和函数可以一步完成计算,无需多次调用mutate和条件判断:
library(dplyr) # 构造数据框 df <- tibble( replicate = 1:6, Volume_loss = c(419.29,450.69,409.73,405.67,367.81,448.61), start = 2982 ) # 计算最终体积 df <- df %>% mutate(Final_Volume = start - cumsum(Volume_loss))
代码说明
cumsum(Volume_loss)会生成体积损失的累积序列:第1个值为419.29,第2个值为419.29+450.69=870.08,以此类推- 用起始体积减去该累积序列,正好得到每个样本的最终体积,完全符合需求
运行后得到的Final_Volume列与预期结果完全一致。
内容的提问来源于stack exchange,提问作者Charlie_Dont_Surf
相关产品推荐
相关产品推荐

