df.match.demo <- df.merge.demo %>%
filter(!is.na(ID), !is.na(group), !is.na(gender), !is.na(age)) %>%
mutate(
treat = group == "ACL",
gender = factor(trimws(gender))
)
df.pairs.1to1 <- df.match.demo %>%
group_by(gender, treat) %>%
arrange(age, ID, .by_group = TRUE) %>% # sort by age within gender+treat
mutate(rank_in_group = row_number()) %>%
ungroup() %>%
group_by(gender, rank_in_group) %>%
filter(n() == 2, sum(treat) == 1) %>% # ensures 1 treated + 1 control
ungroup() %>%
mutate(subclass = as.integer(factor(paste(gender, rank_in_group)))) %>%
arrange(subclass, desc(treat)) %>%
select(subclass, ID, group, treat, gender, age, weight, height, Dominant_leg, Injured_leg)
#View(df.pairs.1to1)
##dropouts AFTER exact gender constraint (i.e., eligible but unmatched)
dropouts_after_gender <- df.match.demo %>%
anti_join(df.pairs.1to1 %>%
distinct(ID), by = "ID") %>%
group_by(gender) %>%
mutate(reason = if_else(treat,
"Unmatched treated (not enough controls in gender)",
"Unmatched control (not enough treated in gender)")) %>%
ungroup() %>%
select(ID, group, treat, gender, age, reason)
#View(dropouts_after_gender)