Вот еще одно R
решение. Что делает эту проблему более сложной, чем большинство, так это то, что ее нельзя рассматривать как проблему разделения-применения-объединения, поскольку выбираемая строка зависит не только от всех строк с заданным значением TreatmentID
, но и от результата того, что было определено предыдущим (предполагая, что это означает следующее наименьшее) TreatmentID
.
Во-первых, данные в виде, пригодном для вставки (на случай, если кто-то еще захочет это сделать):
dat <-
structure(list(PatientName = c("Tim Stuart", "Tim Stuart", "Tim Stuart",
"Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart",
"Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart",
"Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart",
"Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart", "Tim Stuart",
"Tim Stuart"), BVAID = c("BVA-027", "BVA-041", "BVA-021", "BVA-048",
"BVA-020", "BVA-024", "BVA-001", "BVA-013", "BVA-018", "BVA-051",
"BVA-027", "BVA-041", "BVA-048", "BVA-020", "BVA-001", "BVA-002",
"BVA-019", "BVA-044", "BVA-025", "BVA-016", "BVA-013", "BVA-001",
"BVA-002", "BVA-013"), Rank = c(3L, 4L, 7L, 10L, 14L, 15L, 16L,
27L, 28L, 29L, 3L, 4L, 10L, 14L, 16L, 17L, 18L, 22L, 23L, 26L,
27L, 16L, 17L, 27L), TreatmentCode = c("OP_TBC", "OP_TBC", "OP_TBC",
"OP_TBC", "OP_TBC", "OP_TBC", "OP_TBC", "OP_TBC", "OP_TBC", "OP_TBC",
"OP_TC", "OP_TC", "OP_TC", "OP_TC", "OP_TC", "OP_TC", "OP_TC",
"OP_TC", "OP_TC", "OP_TC", "OP_TC", "OP_SICO", "OP_SICO", "OP_SICO"
), TreatmentID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), DoseID = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("PatientName", "BVAID",
"Rank", "TreatmentCode", "TreatmentID", "DoseID"), class = "data.frame",
row.names = c(NA, -24L))
Теперь мое решение
matches <- dat[0,]
TreatmentIDs <- sort(unique(dat$TreatmentID))
for (TreatmentIDidx in seq_along(TreatmentIDs)) {
TreatmentID <- TreatmentIDs[TreatmentIDidx]
treat.flg <- dat$TreatmentID == TreatmentID
match <- dat[treat.flg &
dat$Rank == min(setdiff(dat$Rank[treat.flg],
matches$Rank[matches$TreatmentID==
TreatmentIDs[TreatmentIDidx-1]])),]
matches <- rbind(matches, match)
}
, который дает желаемый результат:
> matches
PatientName BVAID Rank TreatmentCode TreatmentID DoseID
1 Tim Stuart BVA-027 3 OP_TBC 1 1
12 Tim Stuart BVA-041 4 OP_TC 2 1
22 Tim Stuart BVA-001 16 OP_SICO 3 1
Мой SAS
ржавый, и у меня нет копии, чтобы попробовать что-то прямо сейчас, поэтому я оставлю это кому-то другому, чтобы сделать решение SAS
для сравнения.