根据医院数据,我知道不同医生针对不同患者人口统计特定治疗所采取的各种手术。现在我想分析这些不同的路径,并了解哪些是最好的成本。当我说得最好并不意味着最低成本的那个是最好的。应该找出大多数医生遵循的路径,其中成本最低。我的数据是:
Doctor Procedure1 Procedure2 Procedure3 Procedure4 Procedure5 Charge
111 1 2 3 4 5 200
222 1 4 7 4 9 185
333 2 3 5 1 9 250
444 1 2 3 4 6 210
222 1 2 3 4 6 210
我想知道所有这些路径哪一个是最好的。
答案 0 :(得分:0)
以下过程将获得独特的程序组合,并计算它们的受欢迎程度(即行数)以及它们的平均成本:
library(dplyr)
dt = read.table(text = "
Doctor Procedure1 Procedure2 Procedure3 Procedure4 Procedure5 Charge
111 1 2 3 4 5 200
222 1 4 7 4 9 185
333 2 3 5 1 9 250
444 1 2 3 4 6 210
222 1 2 3 4 6 210
", header=T)
dt %>%
group_by(Procedure1,Procedure2,Procedure3,Procedure4,Procedure5) %>% # group by those 5 steps / procedures
summarise(NumRows = n(), # count how many rows they have
AvgCharge = mean(Charge)) %>% # calculate average of charge
ungroup() %>%
arrange(desc(NumRows)) # order by popularity
# # A tibble: 4 x 7
# Procedure1 Procedure2 Procedure3 Procedure4 Procedure5 NumRows AvgCharge
# <int> <int> <int> <int> <int> <int> <dbl>
# 1 1 2 3 4 6 2 210
# 2 1 2 3 4 5 1 200
# 3 1 4 7 4 9 1 185
# 4 2 3 5 1 9 1 250
你应该考虑如何选择最受欢迎的。它是顶级X吗?它是代表Y%行/医生的吗? 那么你应该考虑对你的平均值进行一些统计比较,而不是仅选择最低值。
答案 1 :(得分:0)
对于每个路径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, ]
,并提供:
> dd2
Procedure1 Procedure2 Procedure3 Procedure4 Procedure5 Charge Count
3 1 2 3 4 6 210 2
1 1 4 7 4 9 185 1
也就是说,在那些使用两次12346的路径中,费用最低,费用为210,其中使用的路径14749是最便宜的,费用为185.您现在可以评估计数和充电之间的权衡。 (要查看所有路径的计数,请查看dd
每个路径包含一行,其Count
按Count
和Charge
排序。)
您可以做的另一件事是删除支配的行。也就是说,如果任何行具有比当前行更高的Count和更低的Charge,那么我们可以删除当前行。在这个例子中没有占主导地位的行,但万一可能会删除它们:
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))
更新:简化。