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

如何用dplyr基于上一年数据逐年计算剩余树木数量

用dplyr逐年计算剩余树木数量的正确方案

问题说明

初始树木总量为10,已知每年的树木砍伐量,需要基于上一年的剩余树木量逐年计算当年剩余数量。当前代码未以上一年剩余值为基础更新计算,导致结果错误,需使用dplyr而非循环实现正确计算。

错误代码及输出

错误代码:

trees = 10
year = c(1,2,3,4,5)
removed = c(2,1,0,1,3)

dd <- data.frame(source_trees = trees, 
                 year = year,
                 removed = removed,
                 remained_trees = trees-removed)

错误输出:

> dd
  source_trees year removed remained_trees
1           10    1       2              8    # 正确
2           10    2       1              9    # 应为 8-1=7
3           10    3       0             10    # 应为7-0=7
4           10    4       1              9    # 应为7-1=6
5           10    5       3              7    # 应为6-3=3

正确解决方案

使用dplyr可以通过两种简洁方式实现:

方法1:利用累计求和(cumsum)

通过计算累计砍伐量,用初始树木总量减去累计值得到当年剩余树木数:

library(dplyr)

trees = 10
year = c(1,2,3,4,5)
removed = c(2,1,0,1,3)

dd_correct <- data.frame(year = year, removed = removed) %>%
  mutate(
    source_trees = trees,
    remained_trees = trees - cumsum(removed)
  )

方法2:利用accumulate函数(直观展示逐年计算逻辑)

使用accumulate从初始值开始,逐年用上一年剩余量减去当年砍伐量:

library(dplyr)
library(purrr) # accumulate属于dplyr生态常用的purrr包

trees = 10
year = c(1,2,3,4,5)
removed = c(2,1,0,1,3)

dd_correct <- data.frame(year = year, removed = removed) %>%
  mutate(
    source_trees = trees,
    remained_trees = accumulate(removed, ~ .x - .y, .init = trees)[-1]
  )

正确输出

两种方法都会得到以下正确结果:

> dd_correct
  year removed source_trees remained_trees
1    1       2           10              8
2    2       1           10              7
3    3       0           10              7
4    4       1           10              6
5    5       3           10              3

内容的提问来源于stack exchange,提问作者maycca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:15:12