dd
は、Count
(つまり、そのパスを持つ行の数)を示しています。 dd
は、Count
の降順で、昇順のCharge
の順にソートされます。最後に、Count
の最も安価なパスを、降順で並べ替えてCount
と表示します。与え
dd <- aggregate(list(Count = 1:nrow(DF)), DF[-1], length)
dd <- dd[order(-dd$Count, dd$Charge), ]
dd2 <- dd[ave(dd$Charge, dd$Count, FUN = function(x) x == x[1]) == 1, ]
:12346回使用されるもののパスのうち、
> dd2
Procedure1 Procedure2 Procedure3 Procedure4 Procedure5 Charge Count
3 1 2 3 4 6 210 2
1 1 4 7 4 9 185 1
210の電荷を有する、および14749は185の電荷を有する少なくとも高価で一度使用されるもののパスのうち最も高価ですCountとChargeのトレードオフを評価できるようになりました。 (dd
を見てすべてのパスのためのカウントをご覧になるにはCount
とCharge
によって並べ替えられてCount
とパスごとに1行が含まれています。)
あなたができるもう一つの事は支配行を削除することです。つまり、いずれかの行が現在の行よりも高いCountと低いChargeを持つ場合、現在の行を削除できます。この例でNO支配行が存在しないものの場合、これはそれらを除去するであろうがあるかもしれません:
is_dom <- function(r, DF) with(DF, any(Count[-r] > Count[r] & Charge[-r] < Charge[r]))
dominated <- sapply(1:nrow(dd2), is_dom, dd2)
dd3 <- dd2[!dominated, ]
注:再現可能な形で入力される:
DF <-
structure(list(Doctor = c(111L, 222L, 333L, 444L, 222L), Procedure1 = c(1L,
1L, 2L, 1L, 1L), Procedure2 = c(2L, 4L, 3L, 2L, 2L), Procedure3 = c(3L,
7L, 5L, 3L, 3L), Procedure4 = c(4L, 4L, 1L, 4L, 4L), Procedure5 = c(5L,
9L, 9L, 6L, 6L), Charge = c(200L, 185L, 250L, 210L, 210L)), .Names = c("Doctor",
"Procedure1", "Procedure2", "Procedure3", "Procedure4", "Procedure5",
"Charge"), class = "data.frame", row.names = c(NA, -5L))
更新:簡素化。
質問するときは、より具体的な方法が必要です。 – CCurtis