如何在Data Frame中通过mutate计算累积价格且不覆盖原有数据?
解决方法
方法1:用purrr::accumulate做递推计算
purrr包里的accumulate专门处理这种需要用上一步结果的递推场景,直接从初始price开始,依次累加每一行的difference:
library(dplyr) library(purrr) Data <- Data %>% mutate(price = accumulate(difference, .init = first(price), ~ .x + .y) %>% tail(-1))
方法2:用累积和cumsum简化计算
本质上后续的price就是初始值加上前面所有difference的累积和,所以可以先算累积和再填充:
library(dplyr) Data <- Data %>% mutate( cum_diff = c(NA, cumsum(difference[-1])), price = first(price) + cum_diff ) %>% select(-cum_diff) # 不需要中间列的话可以删掉
运行结果
两种方法都能得到预期结果:
| time | difference | price |
|---|---|---|
| 2000 | NA | 6 |
| 2001 | 3 | 9 |
| 2002 | 4 | 13 |
| 2003 | 6 | 19 |
| 2004 | -8 | 11 |
原代码问题说明
你之前写的mutate(new_price = difference + lag(new_price))没法工作,是因为dplyr的mutate是按列批量计算的,同一轮计算里没法引用刚生成的前一行new_price值,自然得不到递推的结果。
内容的提问来源于stack exchange,提问作者Henry Liu
相关产品推荐
相关产品推荐

