Multiplicação de elementos de um data frame

Caros colegas.

Preciso resolver o seguinte problema. Tenho dois data frames. O primeiro possui a população estimada de todas as cidades do Brasil ao longo de sete anos. O segundo, possui fatores para distribuir a população por idade. Eu preciso estimar a distribuição da idade para todas as cidades, e para todos os anos. Segue um fragmento das dois data frames:

Primero Data frame (estCidadeAnos)

Linha Estado Cidade Ano 2012 Ano 2013 … Ano 2020
1 RO Alta Floresta D’Oest 24069 25652 … 22728
2 RO Alto Alegre dos Pareci 12833 13827 … 14258

5570 DF Brasília 3648532 2789761 … 3055149

Segundo Data frame(Indice1220)

Idade 2012 2013 … Ano 2020
0 0.0147331718 0.0145645850 … 0.0138939406
1 0.0146566370 0.0145801647 … 0.0139638041

+90 0.0024436032 0.0026062054 … 0.0038495541

Então, a cidade de Alta Floresta D’Oeste em Rondônia tinha, em 2012, uma população estimada de 24.069 habitantes. Eu preciso distribuir a população total por idades que vão 0 anos de idade, até +90 anos. Preciso fazer isso para todas as 5570 cidades ao longo dos anos de 2012 a 2020.

Exemplo:

População de Alta Floresta D’Oeste

[2012] 24069*(0.0145645850, 0.0146566370, …, 0.0024436032)[91 linha]

[2013] 25652*(0.0147331718, 0.0145801647, …, 0.0139638041)[91 linha]

[2020]

Resumindo: Preciso estimar as idades de todas as cidades brasileiras ao longo de alguns anos a partir de índices.

Qual o caminho vocês apontariam para resolver isso.

Desde já agradeço.

Olá, @Hidelbrando!

Vou tentar montar um exemplo reprodutível do seu problema.

A primeira coisa que você precisa fazer é empilhar a sua base de cidades, para que o ano seja uma variável. Para isso, você pode usar a função pivot_longer() do pacote {tidyr}.

Então teremos uma base assim:

da_pop <- tibble::tribble(
  ~muni, ~ano, ~pop,
  "a", "2012", 30,
  "a", "2013", 40,
  "a", "2014", 50,
  "a", "2015", 60,
  
  "b", "2012", 300,
  "b", "2013", 400,
  "b", "2014", 500,
  "b", "2015", 600
)
da_pop
#> # A tibble: 8 x 3
#>   muni  ano     pop
#>   <chr> <chr> <dbl>
#> 1 a     2012     30
#> 2 a     2013     40
#> 3 a     2014     50
#> 4 a     2015     60
#> 5 b     2012    300
#> 6 b     2013    400
#> 7 b     2014    500
#> 8 b     2015    600

Created on 2020-12-23 by the reprex package (v0.3.0)

Você pode fazer o mesmo com a base de idades, chegando numa base de dados assim:

da_idade <- tibble::tribble(
  ~ano, ~fx_idade, ~prop_idade,
  "2012", "0-30", 0.0809223,
  "2012", "30-60", 0.4249373,
  "2012", "60-90", 0.2681114,
  "2012", "90+", 0.2260290,
  
  "2013", "0-30", 0.21027224,  
  "2013", "30-60", 0.39199514,
  "2013", "60-90", 0.00965058,
  "2013", "90+", 0.38808204,
  
  "2014", "0-30", 0.5278852,   
  "2014", "30-60", 0.1400957,
  "2014", "60-90", 0.2990308,
  "2014", "90+", 0.0329883,
  
  "2015", "0-30", 0.3130234,   
  "2015", "30-60", 0.1175562,
  "2015", "60-90", 0.4445534,
  "2015", "90+", 0.1248669
)
da_idade
#> # A tibble: 16 x 3
#>    ano   fx_idade prop_idade
#>    <chr> <chr>         <dbl>
#>  1 2012  0-30        0.0809 
#>  2 2012  30-60       0.425  
#>  3 2012  60-90       0.268  
#>  4 2012  90+         0.226  
#>  5 2013  0-30        0.210  
#>  6 2013  30-60       0.392  
#>  7 2013  60-90       0.00965
#>  8 2013  90+         0.388  
#>  9 2014  0-30        0.528  
#> 10 2014  30-60       0.140  
#> 11 2014  60-90       0.299  
#> 12 2014  90+         0.0330 
#> 13 2015  0-30        0.313  
#> 14 2015  30-60       0.118  
#> 15 2015  60-90       0.445  
#> 16 2015  90+         0.125

Created on 2020-12-23 by the reprex package (v0.3.0)

Sua base final então pode ser obtida fazendo o join dessas bases. O número de linhas da base será n_anos x n_municipios x n_faixas. Então pode ficar bem grande :slight_smile:

library(magrittr)
da_result <- da_pop %>% 
  dplyr::inner_join(da_idade, "ano") %>% 
  dplyr::mutate(pop_estimada = pop * prop_idade)

da_result
#> # A tibble: 32 x 6
#>    muni  ano     pop fx_idade prop_idade pop_estimada
#>    <chr> <chr> <dbl> <chr>         <dbl>        <dbl>
#>  1 a     2012     30 0-30        0.0809         2.43 
#>  2 a     2012     30 30-60       0.425         12.7  
#>  3 a     2012     30 60-90       0.268          8.04 
#>  4 a     2012     30 90+         0.226          6.78 
#>  5 a     2013     40 0-30        0.210          8.41 
#>  6 a     2013     40 30-60       0.392         15.7  
#>  7 a     2013     40 60-90       0.00965        0.386
#>  8 a     2013     40 90+         0.388         15.5  
#>  9 a     2014     50 0-30        0.528         26.4  
#> 10 a     2014     50 30-60       0.140          7.00 
#> # … with 22 more rows

Created on 2020-12-23 by the reprex package (v0.3.0)

Espero ter ajudado!

1 Curtida

Olá @jtrecenti.

Vou estudar com atenção sua sugestão. Mas desde já, minha gratidão.

Att.
Hidelbrando

1 Curtida