首页 > 解决方案 > 根据恒定增长因子计算每月人口估计值

问题描述

我希望有一个简单的解决方案,但我无法解决它。

我有一些城市的人口规模,例如:

df <- data.frame(city = c("A","B","C","D","E","F","G"), start_pop = c(100,200,300,400,500,600,700))

start_pop是 2019 年 1 月的人口。假设人口每月增长 0.022%,我想计算每个城市到 2019 年、2020 年和 2021 年的每月人口估计值,另存为Jan19Feb19,这依赖于前面的输入计算。

我可以做到这一点mutate,例如:

increase <- 1.00022
df <- data.frame(city = c("A","B","C","D","E","F","G"), start_pop = c(100,200,300,400,500,600,700)) %>% 
  mutate(Feb19 = start_pop * increase) %>% 
  mutate(Mar19 = Feb19 * increase) %>% 
  mutate(Apr19 = Mar19 * increase)
...

但是有没有更简洁的方法来获得相同的结果,可能是通过循环或应用函数?

标签: rloops

解决方案


这会吗?

increase <- 0.00022

df %>% mutate(mon = as.Date("2019-01-01")) %>%
  group_by(city) %>%
  complete(mon = seq.Date(from = as.Date("2019-01-01"), to = as.Date("2021-12-01"), by = "month")) %>%
  mutate(start_pop = if_else(is.na(start_pop), increase+1, start_pop),
         start_pop = cumprod(start_pop)) %>%
  pivot_wider(names_from = mon, values_from = start_pop)

# A tibble: 7 x 37
# Groups:   city [7]
  city  `2019-01-01` `2019-02-01` `2019-03-01` `2019-04-01` `2019-05-01` `2019-06-01`
  <chr>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
1 A              100         100.         100.         100.         100.         100.
2 B              200         200.         200.         200.         200.         200.
3 C              300         300.         300.         300.         300.         300.
4 D              400         400.         400.         400.         400.         400.
5 E              500         500.         500.         500.         500.         501.
6 F              600         600.         600.         600.         601.         601.
7 G              700         700.         700.         700.         701.         701.
# ... with 30 more variables: `2019-07-01` <dbl>, `2019-08-01` <dbl>, `2019-09-01` <dbl>,
#   `2019-10-01` <dbl>, `2019-11-01` <dbl>, `2019-12-01` <dbl>, `2020-01-01` <dbl>,
#   `2020-02-01` <dbl>, `2020-03-01` <dbl>, `2020-04-01` <dbl>, `2020-05-01` <dbl>,
#   `2020-06-01` <dbl>, `2020-07-01` <dbl>, `2020-08-01` <dbl>, `2020-09-01` <dbl>,
#   `2020-10-01` <dbl>, `2020-11-01` <dbl>, `2020-12-01` <dbl>, `2021-01-01` <dbl>,
#   `2021-02-01` <dbl>, `2021-03-01` <dbl>, `2021-04-01` <dbl>, `2021-05-01` <dbl>,
#   `2021-06-01` <dbl>, `2021-07-01` <dbl>, `2021-08-01` <dbl>, `2021-09-01` <dbl>,
#   `2021-10-01` <dbl>, `2021-11-01` <dbl>, `2021-12-01` <dbl>

在此处输入图像描述


推荐阅读