You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中使用accumulate函数以倒数第二个值为.init参数计算目标列值

你原来的代码出现NA的根本原因是调用了原始数据集里的ind列进行计算,原始ind列3行及以后都是NA,计算到第5行时取ind[3]自然返回NA。

修正后的完整代码

library(tidyverse)

dt %>%
  group_by(id) %>%
  mutate(ind = accumulate(
    .x = tail(ret, -2), # 从第3个ret开始迭代
    .init = head(ind, 2), # 初始状态为前两个已知的ind值
    ~ c(.x[2], .x[1] * (1 + .y)) # 每次迭代保留最近两个ind值,用前前个计算新值
  ) %>% 
  map_dbl(last) %>% # 提取每次迭代生成的新ind值
  {c(head(ind, 2), .)}) # 拼接前两个初始值和计算得到的后续值

运行结果

# A tibble: 10 × 4
# Groups:   id [2]
   id     time      ret   ind
   <chr> <int>    <dbl> <dbl>
 1 a         1  0.00554 120  
 2 a         2 -0.00280 125  
 3 a         3  0.0178  122. 
 4 a         4  0.00187 125. 
 5 a         5  0.0114  123. 
 6 b         1  0.00416 120  
 7 b         2  0.0123  125  
 8 b         3  0.00237 120. 
 9 b         4 -0.00365 125. 
10 b         5  0.0111  121. 

逻辑说明

我们通过accumulate维护一个长度为2的状态向量,每次迭代时:

  • 状态向量的第一个元素是t-2位置的ind值,用来计算当前位置的新ind
  • 计算完成后更新状态向量,把原来的第二个元素(即t-1位置的ind)移到第一位,新计算的ind放到第二位
  • 最终把所有迭代生成的新值和初始的两个ind值拼接,得到完整的结果列

内容的提问来源于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.10 23:18:01