如何基于各分组的滞后值应用公式完成分组变量预测计算
你的原有代码采用的是R默认的向量化并行计算逻辑,赋值给forecast_gdp全组首行值后,后续计算是直接把所有位置的首行值同时乘以(1+cagr),并不会迭代引用上一行刚生成的forecast_gdp结果,所以无法得到累积计算的滞后投影值。
使用tidyverse生态的purrr::accumulate函数实现迭代累积计算即可达到预期效果,完整可运行代码如下:
library(tidyverse) # 创建示例数据 year <- c(2016:2020, 2016:2020, 2016:2020) group <- as.character(c(rep(c("A", "B", "C"), c(5,5,5)))) gdp <- as.numeric(c(100,0,0,0,0,100,0,0,0,0,100,0,0,0,0)) cagr <- c(rep(c(0.3, 0.6, 0.9), c(5,5,5))) df <- data.frame(year, group, gdp, cagr) # 修改后计算逻辑 df <- df %>% group_by(group) %>% mutate(forecast_gdp = accumulate( .x = cagr, .f = ~ .x * (1 + .y), .init = first(gdp) ) %>% tail(-1))
代码说明
accumulate函数会按顺序迭代处理.x传入的向量,每一步的计算结果会作为下一次迭代的第一个参数(代码中的.x).init参数指定迭代初始值为分组的首行gdp值,因为初始值会额外占一位结果,所以用tail(-1)去掉多余的初始值,保证输出长度和分组行数一致- 该写法也兼容同分组内每年
cagr不同的场景,不需要修改逻辑
如果偏好base R写法,可以用Reduce实现相同效果,核心逻辑一致:
df <- df %>% group_by(group) %>% mutate(forecast_gdp = Reduce( f = function(prev, curr) prev*(1+curr), x = cagr, init = first(gdp), accumulate = TRUE )[-1])
内容的提问来源于stack exchange,提问作者Andres Gonzalez
相关产品推荐
相关产品推荐

