在R中按条件新增行与值:结合实际值与增长率生成年度数据
R实现季度实际值结合年度增长率生成年度序列的方法
你可以直接用tidyverse套件实现需求,逻辑支持后续新增预测年份,仅需更新增长率表即可,无需调整处理代码。
完整实现代码
# 加载依赖包 library(tidyverse) # 你的示例数据 df_actuals <- tibble(year=c(2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2020), quarter=c(1, 2, 3, 4, 1, 2, 3, 4, 1), value=c(10, 12, 10, 8, 9, 17, 11, 14, 15) ) df_projections <- tibble(year=c(2018, 2019, 2020, 2021), annual_growth=c(.026, .031, .017, .019)) # 第一步:按年聚合季度实际值,统计季度数和年度实际均值 df_annual_actual <- df_actuals %>% group_by(year) %>% summarise( n_quarters = n(), actual_annual = mean(value, na.rm = TRUE) ) # 第二步:关联增长率表,计算最终年度值 df_result <- df_projections %>% left_join(df_annual_actual, by = "year") %>% arrange(year) %>% mutate( value = pmap_dbl( list(year, n_quarters, actual_annual, annual_growth), function(cur_year, q_cnt, actual_val, growth) { # 当年有完整4个季度数据,直接用实际均值 if (!is.na(q_cnt) && q_cnt == 4) return(actual_val) # 找到上一个有完整实际数据的年份作为基准 last_full_year <- df_annual_actual %>% filter(n_quarters == 4, year < cur_year) %>% arrange(desc(year)) %>% slice(1) # 计算基准年到当前年的累积增长率乘积 cum_growth <- df_projections %>% filter(year > last_full_year$year, year <= cur_year) %>% pull(annual_growth) %>% `+`(1) %>% prod() # 返回推算值 return(last_full_year$actual_annual * cum_growth) } ), value = round(value, 2) ) %>% select(year, value)
输出结果
> df_result # A tibble: 4 × 2 year value <dbl> <dbl> 1 2018 10.00 2 2019 12.75 3 2020 12.97 4 2021 13.21
扩展性说明
如果需要新增2022、2023等后续年份的预测,仅需要在df_projections表中新增对应年份的year和annual_growth记录即可,处理逻辑无需调整。如果后续更新季度实际数据,某年度凑齐4个季度后,代码会自动切换为使用该年度的实际均值,不需要手动修改推算逻辑。
内容的提问来源于stack exchange,提问作者cwod
相关产品推荐
相关产品推荐

