如何在R DataFrame中基于growth_rate推算缺失的total值(含负增长率)
基于增长率推算缺失值的R实现
我有一个包含year、growth_rate和total列的R DataFrame,其中仅单个年份的total字段有有效值,其余均为NA。需要通过growth_rate字段推算所有缺失的total值,规则如下:
- 已知年份之后的年份:从已知值开始,逐年累计乘以对应年份的
growth_rate进行递增计算(例如已知2018年的total,2019年值为2018年total × 2018年growth_rate,2020年值为2018年total × 2018年growth_rate × 2019年growth_rate) - 已知年份之前的年份:从已知值开始,逐年除以对应年份的
growth_rate进行折现计算(例如已知2018年的total,2017年值为2018年total ÷ 2017年growth_rate,2016年值为2018年total ÷ 2017年growth_rate ÷ 2016年growth_rate)
本次需求需支持负增长率场景,示例数据集及目标结果字段total_projection如下:
# 示例数据集 df <- data.frame( year = c(2016, 2017, 2018, 2019, 2021, 2022, 2023), growth_rate = c(0.0678912, 0.0526389, 0.099030, -0.830844, 0.830764, -0.656793, 1.253578), total = c(NA, NA, 1141262, NA, NA, NA, NA), total_projection = c(1139887, 1140661, 1141262, 1142392, 1132901, 1142312, 1134810) )
解决方案代码
以下是实现该逻辑的R代码,支持任意单个已知年份、负增长率及非连续年份的场景:
library(dplyr) library(tidyr) # 定位已知total值的年份和对应数值 known_year <- df$year[!is.na(df$total)] known_total <- df$total[!is.na(df$total)] # 按年份排序,保证计算顺序正确 df_sorted <- df %>% arrange(year) # 计算增长/折现因子及累计乘积 df_sorted <- df_sorted %>% mutate( is_known = year == known_year, # 分场景定义因子:已知年份前用1/增长率(折现),之后用增长率(增长),当前为1 growth_factor = case_when( year < known_year ~ 1 / growth_rate, year == known_year ~ 1, year > known_year ~ growth_rate ), # 从已知年份向前后扩散计算累计因子 cum_growth = ifelse(is_known, 1, NA), cum_growth = ifelse(year > known_year, cumprod(growth_factor), cum_growth), cum_growth = ifelse(year < known_year, rev(cumprod(rev(growth_factor))), cum_growth) ) # 生成推算结果并恢复原始数据顺序 df_result <- df_sorted %>% mutate(total_projection = known_total * cum_growth) %>% select(year, growth_rate, total, total_projection) %>% arrange(match(year, df$year)) # 查看结果 print(df_result)
代码说明
- 首先定位唯一的已知
total值及其年份,确保逻辑适配单已知值场景 - 对数据按年份排序,避免非连续年份导致的计算顺序错误
- 通过
case_when()分别定义折现因子(已知年份前)和增长因子(已知年份后) - 利用
cumprod()和反向累计乘积,从已知年份向前后扩散计算累计因子 - 最后用已知
total值乘以累计因子得到推算结果,并恢复原始数据的年份顺序
内容的提问来源于stack exchange,提问作者Stephen Okiya
相关产品推荐
相关产品推荐

