diff --git a/R/best_and_worst_cases.R b/R/best_and_worst_cases.R
new file mode 100644
index 00000000..decde9ef
--- /dev/null
+++ b/R/best_and_worst_cases.R
@@ -0,0 +1,23 @@
+best_and_worst_cases <- function(data) {
+  data |>
+    mutate(amount_of_distinct_products = dplyr::n_distinct(.data$clustered), .by = "companies_id") |>
+    mutate(equal_weight = (1/.data$amount_of_distinct_products)) |>
+    lowest_risk_category_per_company(.by = "companies_id") |>
+    highest_risk_category_per_company(.by = "companies_id") |>
+    mutate(dummy_best = ifelse(.data$risk_category == .data$min_risk_category_per_company, 1, 0)) |>
+    mutate(dummy_worst = ifelse(.data$risk_category == .data$max_risk_category_per_company, 1, 0)) |>
+    mutate(count_best_case_products_per_company_benchmark = sum(.data$dummy_best), .by = c("companies_id", "grouped_by")) |>
+    mutate(count_worst_case_products_per_company_benchmark = sum(.data$dummy_worst), .by = c("companies_id", "grouped_by")) |>
+    mutate(best_case = ifelse(.data$count_best_case_products_per_company_benchmark == 0, NA, .data$dummy_best/.data$count_best_case_products_per_company_benchmark)) |>
+    mutate(worst_case = ifelse(.data$count_worst_case_products_per_company_benchmark == 0, NA, .data$dummy_worst/.data$count_worst_case_products_per_company_benchmark))
+}
+
+lowest_risk_category_per_company <- function(data, .by) {
+  risk_order <- c("low", "medium", "high")
+  mutate(data, min_risk_category_per_company = risk_order[which(risk_order %in% .data$risk_category)[1]], .by = all_of(.by))
+}
+
+highest_risk_category_per_company <- function(data, .by) {
+  risk_order <- c("high", "medium", "low")
+  mutate(data, max_risk_category_per_company = risk_order[which(risk_order %in% .data$risk_category)[1]], .by = all_of(.by))
+}