library(dplyr)
library(tidyr)
library(flextable)
district_cols <- c(
"Larde_Baseline", "Larde_Endline",
"Mecuburi_Baseline", "Mecuburi_Endline",
"Memba_Baseline", "Memba_Endline",
"Moma_Baseline", "Moma_Endline"
)
percent_table <- function(data, var) {
data |>
group_by(District, survey_type, !!sym(var)) |>
summarise(n = n(), .groups = "drop") |>
group_by(District, survey_type) |>
mutate(pct = round(n / sum(n) * 100, 1)) |>
select(District, survey_type, !!sym(var), pct)
}
row_labels <- c(
"",
"Surveys per district",
"HWISE score, \nmean ± SD",
"Insecurity level, %",
"High", "Moderate", "Low", "No-to-Marginal",
"Improved water source, %",
"No", "Yes",
"Collect (min.), median (IQR)",
"Satisfied with service, %",
"No", "Yes"
)
results_general <- data.frame(Row = row_labels, stringsAsFactors = FALSE)
row_surveys <- which(results_general$Row == "Surveys per district")
row_hwise <- which(results_general$Row == "HWISE score, \nmean ± SD")
rows_insecurity <- which(results_general$Row %in%
c("High","Moderate","Low","No-to-Marginal"))
rows_improved <- which(results_general$Row %in% c("No","Yes"))[1:2]
row_collect <- which(results_general$Row == "Collect (min.), median (IQR)")
rows_satisfied <- which(results_general$Row %in% c("No","Yes"))[3:4]
surveys_per_district <- clean |>
group_by(District, survey_type) |>
summarise(n = n(), .groups = "drop") |>
pivot_wider(names_from = c(District, survey_type),
values_from = n,
names_sep = "_")
results_general[row_surveys, 2:9] <- surveys_per_district |> select(all_of(district_cols)) |> as.matrix()
hwise_table <- clean |>
group_by(District, survey_type) |>
summarise(
mean_sd = paste0(round(mean(hwise_score, na.rm = TRUE), 1), " \n± ", round(sd(hwise_score, na.rm = TRUE), 1)),
.groups = "drop"
) |>
pivot_wider(names_from = c(District, survey_type),
values_from = mean_sd,
names_sep = "_")
results_general[row_hwise, 2:9] <- hwise_table |> select(all_of(district_cols)) |> as.matrix()
insecurity_table <- percent_table(clean, "insecurity_level") |>
pivot_wider(names_from = c(District, survey_type),
values_from = pct,
names_sep = "_")
results_general[rows_insecurity, 2:9] <- insecurity_table |> select(-insecurity_level) |> select(all_of(district_cols)) |> as.matrix()
improved_table <- percent_table(clean, "whether_improved") |>
pivot_wider(names_from = c(District, survey_type),
values_from = pct,
names_sep = "_")
results_general[rows_improved, 2:9] <- improved_table |> select(-whether_improved) |> select(all_of(district_cols)) |> as.matrix()
collect_time_table <- clean |>
group_by(District, survey_type) |>
summarise(
median = median(total_collect_time, na.rm = TRUE),
IQR = paste0("[", quantile(total_collect_time, 0.25, na.rm = TRUE), "-", quantile(total_collect_time, 0.75, na.rm = TRUE), "]"),
.groups = "drop"
) |>
mutate(summary = paste0(median, "\n", IQR)) |>
select(District, survey_type, summary) |>
pivot_wider(names_from = c(District, survey_type),
values_from = summary,
names_sep = "_")
results_general[row_collect, 2:9] <- collect_time_table |> select(all_of(district_cols)) |> as.matrix()
satisfied_table <- percent_table(clean, "satisfied") |>
pivot_wider(names_from = c(District, survey_type),
values_from = pct,
names_sep = "_")
results_general[rows_satisfied, 2:9] <- satisfied_table |> select(-satisfied) |> select(all_of(district_cols)) |> as.matrix()
col_keys <- c("row", district_cols)
names(results_general) <- col_keys
ft <- flextable(results_general) |>
set_caption(caption = "Changes in Water Services Before and After Intervention, by District") |>
set_header_labels(
Mecuburi_Baseline = "Baseline",
Mecuburi_Endline = "Endline",
Larde_Baseline = "Baseline",
Larde_Endline = "Endline",
Memba_Baseline = "Baseline",
Memba_Endline = "Endline",
Moma_Baseline = "Baseline",
Moma_Endline = "Endline"
) |>
add_header_lines( "" ) |>
add_header_row(
values = c("", "Larde", "Mecuburi", "Memba",
"Moma"),
colwidths = c(1, 2, 2, 2, 2)
) |>
merge_h(part = "header") |>
width(j = 1, width = 4) |>
width(j = 2:9, width = 0.9) |>
align(align = "center", part = "all") |>
colformat_num(j = 2:9, digits = 1) |>
fontsize(size = 11, part = "body") |>
bg(i = c(2,4,5,6,7,8,12), j = 1:9, bg = "lightblue") |>
fontsize(i = 1, size = 16, part = "header") |>
bold(i = 1, part = "header") |>
fontsize(i = 2, size = 14, part = "header") |>
bold(i = 2, part = "header") |>
fontsize(i = 3, size = 10, part = "header") |>
bold(i = 3, part = "header") |>
bold(j = 1, part = "body")|>
color(j = c(3, 5, 7, 9), color = "blue", part = "body") |>
color(j = c(3, 5, 7, 9), color = "blue", part = "header")
ft