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
相关产品推荐
相关产品推荐

