'CAGR Calculation for different variables in R
Solution 1:[1]
Try this ...
library(tidyverse)
library(scales)
#>
#> Attaching package: 'scales'
#> The following object is masked from 'package:purrr':
#>
#> discard
#> The following object is masked from 'package:readr':
#>
#> col_factor
growth <- function(x, y){
((x / first(x)) ^ (1 / (y - first(y)))) - 1
}
data_df <- tribble(
~Crop, ~Year, ~Area, ~Yield, ~Rainfall,
"Coconut ", 2000L, 18168, 3583.22324966975, 2763.2,
"Coconut ", 2001L, 18190, 3542.05607476636, 3080.9,
"Coconut ", 2002L, 18240, 3700.10964912281, 2620.2,
"Coconut ", 2003L, 18284.74, 3750.66859031083, 2355.9,
"Coconut ", 2004L, 18394.7, 2847.5593513349, 2460.1,
"Coconut ", 2005L, 13876.57, 3749.48564378661, 2954.7,
"Coconut ", 2006L, 14358, 4134.97701629753, 2404.7,
"Rice", 2000L, 102, 3.14705882352941, 2763.2,
"Rice", 2001L, 83, 3.6144578313253, 3080.9,
"Rice", 2002L, 189.2, 2.7, 2620.2,
"Rice", 2003L, 52, 1.73403846153846, 2355.9,
"Rice", 2004L, 52.94, 1.37079712882508, 2460.1,
"Rice", 2005L, 2.09, 5.77033492822967, 2954.7,
"Rice", 2006L, 6854.3, 2.77134353617437, 2404.7,
"Sugarcane", 2000L, 1, 2, 2763.2,
"Sugarcane", 2001L, 1, 1, 3080.9,
"Sugarcane", 2002L, 5, 8, 2620.2,
"Sugarcane", 2003L, 268, 10.7444776119403, 2355.9,
"Sugarcane", 2006L, 0.2, 2.5, 2404.7
)
data_df |>
group_by(Crop) |>
mutate(across(c(Area, Rainfall, Yield), ~ growth(., Year), .names = "{.col}_cagr")) |>
slice_tail(n = 1) |>
pivot_longer(ends_with("_cagr")) |>
ggplot(aes(Crop, value, fill = name)) +
geom_col(position = "dodge") +
scale_y_continuous(labels = label_percent()) +
labs(x = NULL, y = "CAGR", fill = NULL) +
theme_bw()

Created on 2022-05-07 by the reprex package (v2.0.1)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |


