Olá! Estou tentando substituir um for em um código e tenho certeza que é possível, mas não consegui pensar em alguma alternativa. O objetivo é calcular um índice na linha i+1, para fazer isso eu pego o valor da linha i+1, divido por 100 e somo 1, multiplicado pelo índice na linha i. Dá para perceber que o índice é calculado com base no indice anterior, como faço isso de forma tidy?
Agradeço desde já
saldo_pj <- BETS::BETSget(20540)
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
#> Warning:
#> BETS-package: There is no corresponding entry in the metadata table.
#>
#> Don't worry, this is not a critical problem. We are working on a solution.
ipca <- sidrar::get_sidra(1737,
variable = 63,
period = c('200703-202110'),
geo = 'Brazil',
header = TRUE)
#> Considering all categories once 'classific' was set to 'all' (default)
ipca_mes <- ipca |>
tibble::as_tibble() |>
janitor::clean_names() |>
dplyr::select(mes, valor) |>
dplyr::mutate(indice = 1)
for (i in 1:nrow(ipca_mes)) {
ipca_mes[i+1, "indice"] = (ipca_mes[i+1, "valor"]/100+1 )*ipca_mes[i, "indice"]
}
ipca_mes |>
dplyr::slice(- dplyr::n()) |>
dplyr::mutate(
deflator = dplyr::last(indice) / indice)
#> # A tibble: 176 × 4
#> mes valor indice deflator
#> <chr> <dbl> <dbl> <dbl>
#> 1 março 2007 0.37 1 2.27
#> 2 abril 2007 0.25 1.00 2.27
#> 3 maio 2007 0.28 1.01 2.26
#> 4 junho 2007 0.28 1.01 2.25
#> 5 julho 2007 0.24 1.01 2.25
#> 6 agosto 2007 0.47 1.02 2.24
#> 7 setembro 2007 0.18 1.02 2.23
#> 8 outubro 2007 0.3 1.02 2.23
#> 9 novembro 2007 0.38 1.02 2.22
#> 10 dezembro 2007 0.74 1.03 2.20
#> # … with 166 more rows