R语言data.table递推计算food(n)值问题求助
用data.table实现递推公式的解决方案
我来帮你搞定这个递推计算的问题!你需要实现food(n) = food(n-1) * xRatio.food(n)的递推逻辑,初始值是2005年的c_Crust,对吧?我给你整理了完整的可运行代码和解释:
首先先把你的数据定义补全换行(方便fread正确读取):
library(data.table) DT <- fread("year c_Crust xRatio.c_Crust X2005 0.01504110 NA X2010 NA 0.9883415 X2015 NA 1.0685221 X2020 NA 1.0664189 X2025 NA 1.0348418 X2030 NA 1.0370386 X2035 NA 1.0333771 X2040 NA 1.0165511 X2045 NA 1.0010563 X2050 NA 1.0056368")
核心实现代码
这里不用写复杂循环,直接利用data.table的cumprod()(累积乘积)函数就能高效完成递推:
# 提取2005年的初始值 initial_val <- DT[year == "X2005", c_Crust] # 计算递推结果列`res` DT[, res := initial_val * cumprod(ifelse(is.na(xRatio.c_Crust), 1, xRatio.c_Crust))]
代码逻辑解释
cumprod()会自动计算向量的累积乘积,比如输入[a,b,c],输出就是[a, a*b, a*b*c],完美匹配递推的乘法逻辑- 2005年的
xRatio.c_Crust是NA,用ifelse()把它替换成1,这样2005年的累积乘积就是1,乘初始值就等于初始值本身 - 从2010年开始,每一步的累积乘积都是前面所有年份
xRatio.c_Crust的乘积,再乘初始值就正好对应你要的递推结果
额外优化:确保年份有序
如果你的数据年份不是按时间顺序排列的,先排序再计算会更稳妥:
DT <- DT[order(year)]
运行完代码后,你就能看到DT里多了一列res,就是你需要的递推计算结果啦!
内容的提问来源于stack exchange,提问作者JerryN
相关产品推荐
相关产品推荐

