我正在尝试模拟每年沉积的死木中生物量的积累。木材每年以4.6%的速度腐烂。
我的数据已格式化:
颜色:治疗,年份,新存款 处理(A,B,C ...) 年(0:105) New.deposit(数字)
在过去的几天中,我尝试了如下所示的功能组合,但最终得到了错误的组合-也许我使事情变得太困难了:
#OBS! These code attempts are incorrect.
df <- df %>% group_by(Treatment) %>% mutate(Accumulated.deposits = cumsum(lag(New.deposit, n=1, default=0))*(1-0.046))
df <- df %>% group_by(Treatment) %>% mutate(Accumulated.deposits = cumsum((lag(Accumulated.deposits, n=1, default=0)*(1-0.046))) + new.deposit
My goal is to have one variable, Accumulated.biomass.yearY = deposit.year0 * (1-0.046)^(Y) + deposit.year1 * (1-0.046)^(Y-1) + deposit.year2 * (1-0.046)^(Y-2)..... deposit.yearY * (1-0.046)^(Y-Y).
我希望矩阵显示X年的每年存款中剩余的生物量。
答案 0 :(得分:0)
欢迎来到stackoverflow。你可以尝试这样的事情吗?我喜欢分解步骤,以便更轻松地了解正在发生的事情。如果我不完全理解,请发表评论,我将更新我的答案。您也可以在问题中使用此示例数据框,并向我们显示您希望看到的输出,以便我们继续学习。
library(tidyverse)
df <-
tibble(
treatment = rep(LETTERS[1:2], 5),
years = rep(0:4, each = 2),
new_deposit = rep(1:5*10, each = 2)
) %>%
arrange(treatment, years, new_deposit)
df %>%
arrange(treatment, years) %>%
group_by(treatment) %>%
mutate(
prev_deposit = lag(new_deposit, default = 0),
running_sum = cumsum(prev_deposit),
accumulated = running_sum * (1-0.046)^(years)
) %>%
ungroup()
# treatment years new_deposit prev_deposit running_sum accumulated
# <chr> <int> <dbl> <dbl> <dbl> <dbl>
# A 0 10 0 0 0
# A 1 20 10 10 9.54
# A 2 30 20 30 27.3
# A 3 40 30 60 52.1
# A 4 50 40 100 82.8
答案 1 :(得分:0)
数据
set.seed(1)
df <- data.frame(treatment = rep(c('A','B'), each=5), years = rep(1:5, times=2), new_deposit=runif(10))
treatment years new_deposit
1 A 1 0.26550866
2 A 2 0.37212390
3 A 3 0.57285336
4 A 4 0.90820779
5 A 5 0.20168193
6 B 1 0.89838968
7 B 2 0.94467527
8 B 3 0.66079779
9 B 4 0.62911404
10 B 5 0.06178627
自定义功能
custom <- function(z, decay) { ans <- accumulate(z, function(x, y) { (x + y) * (1-decay) }, .init=0); tail(ans, -1) }
该函数将采用向量z
和衰减率decay
,并使用purrr::accumulate
递归地应用公式(x+y)*(1-decay)
,其中x
是{{向量中的第1}}个元素,向量i
中的第y
个元素。我将向量i+1
填充为起始值0,然后不填充.init=0
而返回答案。
用法
tail(ans, -1)