R-基于同一列中以前的值进行变异



数据:

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 + growthcumprod(累积乘积)来获得因子,用它乘以size[1]来填充size列的其余部分。

稍微复杂的是,您的算法必须忽略growth的第一个值。我们可以通过使用leadlag的组合来绕过这一点。

因此,以下内容无需使用循环即可工作。

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

相关内容

  • 没有找到相关文章

最新更新