Tenho este conjunto de dados em R:
set.seed(123)
num_patients <- 50
patient_ids <- rep(1:num_patients, each = sample(2:10, num_patients, replace = TRUE))
n_visits <- length(patient_ids)
start_date <- as.Date("2022-01-01")
end_date <- as.Date("2023-12-31")
visit_dates <- sample(seq(start_date, end_date, by = "day"), n_visits, replace = TRUE)
results <- sample(c("miss", "attend"), n_visits, replace = TRUE, prob = c(0.25, 0.75))
patient_visits <- data.frame(
patient_id = patient_ids,
visit_date = sort(visit_dates[order(patient_ids)]),
result = results
)
head(patient_visits)
Este conjunto de dados mostra como diferentes pacientes compareceram ou faltaram às consultas:
patient_id visit_date result
1 1 2022-01-05 miss
2 1 2022-01-13 attend
3 1 2022-01-20 attend
4 1 2022-01-24 attend
5 2 2022-01-26 attend
6 2 2022-02-03 miss
Quero responder a seguinte pergunta:
- Para pacientes que têm exatamente 1 consulta: qual foi a taxa de faltas na primeira consulta?
- Para pacientes que têm exatamente 2 consultas: qual foi a taxa de faltas na primeira consulta? qual foi a taxa de faltas na segunda consulta?
- Para pacientes que têm exatamente 3 consultas: qual foi a taxa de faltas na primeira consulta? qual foi a taxa de faltas na segunda consulta? qual foi a taxa de faltas na terceira consulta?
- Para pacientes que têm exatamente 4 consultas: qual foi a taxa de faltas na primeira consulta? qual foi a taxa de faltas na segunda consulta? qual foi a taxa de faltas na terceira consulta? qual foi a taxa de faltas em todas as outras consultas (agrupadas em uma)?
Tentei fazer isso manualmente para cada combinação:
patient_visits <- patient_visits[order(patient_visits$patient_id, patient_visits$visit_date), ]
patient_visits$appt_seq <- unlist(tapply(patient_visits$patient_id, patient_visits$patient_id, FUN = function(x) 1:length(x)))
appt_counts <- table(patient_visits$patient_id)
patients_with_1_appt <- as.numeric(names(appt_counts[appt_counts == 1]))
patients_with_2_appt <- as.numeric(names(appt_counts[appt_counts == 2]))
patients_with_3_appt <- as.numeric(names(appt_counts[appt_counts == 3]))
patients_with_4_appt <- as.numeric(names(appt_counts[appt_counts == 4]))
results_df <- data.frame(
total_appointments = numeric(),
appointment_number = character(),
miss_rate = numeric(),
stringsAsFactors = FALSE
)
visits_1 <- patient_visits[patient_visits$patient_id %in% patients_with_1_appt, ]
miss_rate_1 <- mean(visits_1$result == "miss")
results_df <- rbind(results_df, data.frame(
total_appointments = 1,
appointment_number = "1",
miss_rate = miss_rate_1
))
visits_2 <- patient_visits[patient_visits$patient_id %in% patients_with_2_appt, ]
miss_rate_2_first <- mean(visits_2[visits_2$appt_seq == 1, "result"] == "miss")
miss_rate_2_second <- mean(visits_2[visits_2$appt_seq == 2, "result"] == "miss")
results_df <- rbind(results_df, data.frame(
total_appointments = c(2, 2),
appointment_number = c("1", "2"),
miss_rate = c(miss_rate_2_first, miss_rate_2_second)
))
visits_3 <- patient_visits[patient_visits$patient_id %in% patients_with_3_appt, ]
miss_rate_3_first <- mean(visits_3[visits_3$appt_seq == 1, "result"] == "miss")
miss_rate_3_second <- mean(visits_3[visits_3$appt_seq == 2, "result"] == "miss")
miss_rate_3_third <- mean(visits_3[visits_3$appt_seq == 3, "result"] == "miss")
results_df <- rbind(results_df, data.frame(
total_appointments = c(3, 3, 3),
appointment_number = c("1", "2", "3"),
miss_rate = c(miss_rate_3_first, miss_rate_3_second, miss_rate_3_third)
))
visits_4 <- patient_visits[patient_visits$patient_id %in% patients_with_4_appt, ]
miss_rate_4_first <- mean(visits_4[visits_4$appt_seq == 1, "result"] == "miss")
miss_rate_4_second <- mean(visits_4[visits_4$appt_seq == 2, "result"] == "miss")
miss_rate_4_third <- mean(visits_4[visits_4$appt_seq == 3, "result"] == "miss")
miss_rate_4_other <- mean(visits_4[visits_4$appt_seq > 3, "result"] == "miss")
results_df <- rbind(results_df, data.frame(
total_appointments = c(4, 4, 4, 4),
appointment_number = c("1", "2", "3", "4+"),
miss_rate = c(miss_rate_4_first, miss_rate_4_second, miss_rate_4_third, miss_rate_4_other)
))
Existe uma maneira mais fácil de fazer isso no R básico?