数据:
df <- data.frame(year = c(2018, 2019, 2020, 2021),
growth = c(0.05, 0.1, 0.08, 0.06),
size = c(100, NA, NA, NA))
year growth size
1 2018 0.05 100
2 2019 0.10 NA
3 2020 0.08 NA
4 2021 0.06 NA
我有2018
年的尺码和随后几年的增长率。我的目标是将以后每一年的大小计算为size[i] = size[i-1] * (1 + growth[i])
。我可以用for循环来完成:
for (i in (2:nrow(df))) {
df$size[i] <- df$size[i-1] * (1 + df$growth[i])
}
year growth size
1 2018 0.05 100.000
2 2019 0.10 110.000
3 2020 0.08 118.800
4 2021 0.06 125.928
但我找不到dplyr
做同样事情的方法,例如mutate
。希望听到你的想法。谢谢
由于size
的第一个值实际上是列其余部分的乘法常数,我们可以使用1 + growth
的cumprod
(累积乘积)来获得因子,用它乘以size[1]
来填充size
列的其余部分。
稍微复杂的是,您的算法必须忽略growth
的第一个值。我们可以通过使用lead
和lag
的组合来绕过这一点。
因此,以下内容无需使用循环即可工作。
library(dplyr)
mutate(df, size = lag(size[1] * cumprod(lead(growth + 1)), default = size[1]))
#> year growth size
#> 1 2018 0.05 100.000
#> 2 2019 0.10 110.000
#> 3 2020 0.08 118.800
#> 4 2021 0.06 125.928
具有purrr::reduce
:的解决方案
library(tidyverse)
df <- data.frame(year = c(2018, 2019, 2020, 2021),
growth = c(0.05, 0.1, 0.08, 0.06),
size = c(100, NA, NA, NA))
reduce(2:nrow(df), function(x,y)
{x$size[y] <- x$size[y-1]*(1+x$growth[y]); x}, .init=df)
#> year growth size
#> 1 2018 0.05 100.000
#> 2 2019 0.10 110.000
#> 3 2020 0.08 118.800
#> 4 2021 0.06 125.928