R语言用if/else循环实现多列金额按通胀年金化折算为2021年现值
R语言通胀折算到2021年现值实现方案
首先你需要先整理好2014到2021年每一年的同比通胀率数据,以下代码中我先使用示例通胀率匹配你给出的计算逻辑,实际使用时替换为真实通胀数值即可。
# 第一步:构造各年到2021年的累计通胀乘数表 inflation_rate <- list( "2014_2015" = 0.025, "2015_2016" = 0.018, "2016_2017" = 0.032, "2017_2018" = 0.021, "2018_2019" = 0.024, "2019_2020" = 0.012, "2020_2021" = 0.017 ) # 预计算每个交易年份对应的累计乘数(即该年到2021年所有(1+通胀率)的乘积) year_multiplier <- data.frame( year = c(2014,2015,2016,2017,2018,2019,2020,2021), multiplier = c( prod(1+unlist(inflation_rate)), prod(1+unlist(inflation_rate[2:7])), prod(1+unlist(inflation_rate[3:7])), prod(1+unlist(inflation_rate[4:7])), prod(1+unlist(inflation_rate[5:7])), prod(1+unlist(inflation_rate[6:7])), 1+inflation_rate[["2020_2021"]], 1 ) )
方法1:if/else循环实现(符合你要求的实现形式)
# 复制原始数据集 annuitized_dollar <- dollar # 定义需要折算的成本列 cost_cols <- c("variable_costs", "direct_costs", "total_costs") # 逐行循环处理 for(i in 1:nrow(annuitized_dollar)){ current_year <- annuitized_dollar$year[i] # if/else判断对应年份的折算乘数 if(current_year == 2014){ mult <- year_multiplier$multiplier[year_multiplier$year == 2014] } else if(current_year == 2015){ mult <- year_multiplier$multiplier[year_multiplier$year == 2015] } else if(current_year == 2016){ mult <- year_multiplier$multiplier[year_multiplier$year == 2016] } else if(current_year == 2017){ mult <- year_multiplier$multiplier[year_multiplier$year == 2017] } else if(current_year == 2018){ mult <- year_multiplier$multiplier[year_multiplier$year == 2018] } else if(current_year == 2019){ mult <- year_multiplier$multiplier[year_multiplier$year == 2019] } else if(current_year == 2020){ mult <- year_multiplier$multiplier[year_multiplier$year == 2020] } else { mult <- 1 } # 所有成本列乘对应乘数,round保留整数和你示例输出格式一致 annuitized_dollar[i, cost_cols] <- round(annuitized_dollar[i, cost_cols] * mult, 0) } # 重命名列加_2021后缀,删除不需要的列得到最终结果 colnames(annuitized_dollar)[colnames(annuitized_dollar) %in% cost_cols] <- paste0(cost_cols, "_2021") annuitized_dollar <- annuitized_dollar[, paste0(cost_cols, "_2021")]
方法2:更简洁的向量化实现(可选,6700行数据运算效率更高)
library(dplyr) annuitized_dollar <- dollar %>% left_join(year_multiplier, by = "year") %>% mutate( variable_costs_2021 = round(variable_costs * multiplier, 0), direct_costs_2021 = round(direct_costs * multiplier, 0), total_costs_2021 = round(total_costs * multiplier, 0) ) %>% select(variable_costs_2021, direct_costs_2021, total_costs_2021)
内容的提问来源于stack exchange,提问作者taimishu
相关产品推荐
相关产品推荐

