R 寻找最佳医疗途径
从医院的数据中,我知道不同的医生和不同的患者群体为特定治疗所做的各种程序。现在我想分析这些不同的路径,并了解哪一条在成本方面是最好的。当我说最好时,并不意味着成本最低的最好。应该找出大多数医生所遵循的路径,并且从中成本最低。我的数据是:R 寻找最佳医疗途径,r,data-analysis,R,Data Analysis,从医院的数据中,我知道不同的医生和不同的患者群体为特定治疗所做的各种程序。现在我想分析这些不同的路径,并了解哪一条在成本方面是最好的。当我说最好时,并不意味着成本最低的最好。应该找出大多数医生所遵循的路径,并且从中成本最低。我的数据是: Doctor Procedure1 Procedure2 Procedure3 Procedure4 Procedure5 Charge 111 1 2 3 4 5
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
我想知道所有这些路径中哪一条是最好的。以下过程将获得唯一的过程组合,并将计算它们的流行程度(即行数)以及平均成本:
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
库(dplyr)
dt=读取。表格(文本=”
医生程序收费
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
“,页眉=T)
dt%>%
分组依据(程序1、程序2、程序3、程序4、程序5)%>%#按这5个步骤/程序分组
总结(NumRows=n(),#计算它们有多少行
平均收费=平均(收费))%>%#计算平均收费
解组()%>%
按人气排序
##A tibble:4 x 7
#程序1程序2程序3程序4程序5 NumRows平均收费
#
# 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
你应该考虑如何挑选最受欢迎的。是top X吗?是否代表Y%的行/医生?
然后,你应该考虑对你的平均值做一些统计比较,而不是只选择最低值。 对于每个路径<代码> DD/<代码>显示其<代码>计数< />代码(即具有该路径的行数)。code>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的成本最低,收费为210;在使用一次的路径中,14749的成本最低,收费为185。您现在可以评估计数和收费之间的权衡。(要查看所有路径的计数,请查看dd
每个路径包含一行,其Count
按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, ]
is_dom Count[r]&Charge[-r] 在提问时,您需要更加具体。非常感谢,这就是我要找的…添加了一些可选代码以删除占支配地位的行(dd3
)。不会改变示例,但对于您的真实数据,它可能会被使用。感谢您的更改。。。我是通过另一个代码实现的,但是你的代码很简单,也很简单。。这与前面的评论相结合,解决了我的想法。
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))