如何使用R中purrr包的accumulate函数计算两个相互关联的变量
基于purrr::accumulate的解决方案
核心逻辑:对于存在依赖关系的多个迭代变量,只需要让accumulate每次迭代返回包含所有迭代变量的向量,前一次迭代的输出会直接作为下一次迭代的输入,即可实现多变量同步迭代计算。
完整实现代码
第一步:加载依赖包与构造数据集
library(purrr) library(dplyr) # 原始数据集 df <- structure(list(Scenario = c(0, 1, 1, 1, 1, 1, 1, 1, 1, 1), SlNo = c(NA, 1L, 5L, 9L, 13L, 17L, 21L, 25L, 29L, 33L), A = c(NA, 14, 1, 17, 8, 10, 9, 14, 14, 4), B = c(NA, 19, 13, 20, 7, 16, 12, 18, 15, 17), C = c(4, 0, 0, 0, 0, 0, 0, 0, 0, 0), E = c(6, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
第二步:迭代计算C、E值
# 提取2到10行需要用到的迭代参数:Scenario和B iter_params <- transpose(select(df[-1, ], Scenario, B)) # 多状态迭代计算 iter_res <- accumulate( .x = iter_params, .f = \(prev, curr) { if (curr$Scenario != 0) { curr_C <- 0.5 * prev[["C"]] + 5 + curr$B + prev[["E"]] curr_E <- curr_C + curr$B - 50 return(c(C = curr_C, E = curr_E)) } return(c(C = curr$C, E = curr$E)) }, .init = c(C = df$C[1], E = df$E[1]) # 初始值为第一行的C、E ) # 结果合并回原数据框 final_df <- bind_rows(iter_res) %>% rename_with(~paste0(.x, "_new")) %>% bind_cols(df, .) %>% mutate(C = C_new, E = E_new) %>% select(-ends_with("_new"))
输出结果验证
运行后final_df的输出与你给出的预期结果完全一致,C和E的计算逻辑和for循环版本完全等价。这种写法还可以轻松扩展到3个及以上互相依赖的迭代变量,只需要调整每次迭代返回的向量长度即可。
内容的提问来源于stack exchange,提问作者Anoushiravan R
相关产品推荐
相关产品推荐

