You need to enable JavaScript to run this app. 如何使用R中purrr包的accumulate函数计算两个相互关联的变量
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 05:06:00