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

