Ответ 4
Вот еще одно решение R
. Что делает эту проблему сложнее, чем большинство из них, так это то, что она не может рассматриваться как проблема split-apply-comb, поскольку выбранная строка зависит не только от всех строк с заданным 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
My SAS
является ржавым, и у меня нет копии, чтобы попробовать что-то прямо сейчас, поэтому я оставлю его кому-то другому, чтобы сделать сравнение с SAS
.