基于年度增长率的DataFrame前后向值推演实现问题
问题需求
我有一个包含不同年份年度增长量(原描述的annual growth values实际为年度增长量)和某一特定年份已知值的DataFrame,需要基于该已知值:
- 对该年份之前的年份进行反向递减推演
- 对该年份之后的年份进行正向递增推演
示例数据集
ex_df = structure(list(year = c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025), growth = c(1152, -2051, 1074, 1200, 1036, 1593, 1007, 1701, 1642, -1800, 1607), value = c(NA, NA, NA, NA, NA, NA, NA, 11278, NA, NA, NA), new_value = c(5874, 7026, 4975, 6049, 7642, 8678, 10271, 11278, 12979, 14621, 12821)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -11L))
其中:
growth列表示当前年份到下一年的增长量(例如2022年的growth=1701,对应2022到2023年的数值增长1701)value列仅在2022年有已知值11278new_value列是预期得到的推演结果
尝试的代码
ex_df %>% arrange(year) |> mutate(cum_yr_increase = cumsum(growth), new_value_2 = cum_yr_increase + value[year == 2024])
问题分析
这段代码存在两个关键错误:
- 基准年份选取错误:已知值在2022年,但代码中引用了
value[year == 2024](该值为NA) - 累积逻辑错误:
cumsum(growth)是对所有年份的增长量做全局累加,无法区分正向/反向的推演逻辑,不符合需求
正确解决方案
我们可以利用purrr::accumulate分别处理正向(基准年后)和反向(基准年前)的推演,再合并结果:
library(dplyr) library(purrr) # 定义基准年份和对应的已知值 base_year <- 2022 base_value <- ex_df$value[ex_df$year == base_year] # 执行推演计算 ex_df_processed <- ex_df %>% arrange(year) %>% # 正向推演:基准年之后的年份,每个年份值 = 上一年值 + 上一年的增长量 mutate(new_value_forward = accumulate( .x = growth, .f = ~ .x + .y, .init = base_value )[-1]) %>% # 去掉初始的基准值,保留2023-2025的结果 # 反向推演:基准年之前的年份,每个年份值 = 下一年值 - 当前年份的增长量 mutate(new_value_backward = accumulate( .x = rev(growth[year < base_year]), .f = ~ .x - .y, .init = base_value )[-1] %>% rev()) %>% # 反转结果,匹配2015-2021的顺序 # 合并正向、反向和基准年的结果 mutate(new_value_correct = case_when( year == base_year ~ base_value, year > base_year ~ new_value_forward, year < base_year ~ new_value_backward )) %>% # 清理中间变量 select(-new_value_forward, -new_value_backward) # 查看结果 print(ex_df_processed)
运行后得到的new_value_correct列会和示例中的new_value完全一致,满足推演需求。
内容的提问来源于stack exchange,提问作者Stephen Okiya
相关产品推荐
相关产品推荐

