R 按series分组降序排序后计算area列累计运行差值的实现方法
实现方案
你需要的累计迭代减法可以通过purrr::accumulate函数实现,完全适配dplyr管道框架,代码如下:
library(tidyverse) df_diffs <- df %>% dplyr::group_by(series) %>% # 分组内按year降序排序,保证计算顺序正确 dplyr::arrange(desc(year), .by_group = TRUE) %>% # accumulate迭代计算累计差值:首项取area原值,后续每一项=上一步计算结果-当前area dplyr::mutate(diff = purrr::accumulate(area, ~.x - .y)) %>% dplyr::ungroup()
逻辑说明
purrr::accumulate会遍历每组的area列,第一个元素直接返回作为首行diff值,后续每个值都用前一步的计算结果减去当前行area,完全匹配你的计算规则- 自动处理多分组场景,不会出现跨组计算的问题
- 全程在dplyr管道中运行,可以直接接入你现有的业务逻辑
无额外依赖备选方案
如果不想引入purrr依赖,也可以用基础R的Reduce函数实现,效果完全一致:
df_diffs <- df %>% dplyr::group_by(series) %>% dplyr::arrange(desc(year), .by_group = TRUE) %>% dplyr::mutate(diff = Reduce(function(prev, curr) prev - curr, area, accumulate = TRUE)) %>% dplyr::ungroup()
内容的提问来源于stack exchange,提问作者woodland_creature
相关产品推荐
相关产品推荐

