问题描述,需要统计一下,每一天在院的病人数,作为衡量临床医生工作量的一个指标,每天管理的病人数>15(没有上线),该天为达标,满足一个单元,为啥这样只计数不考虑工作难度,不在讨论范围之内。
拿到科密整理的数据后,如下,有关于该医生在科室从2017年到2021年所有治疗的治疗患者的看病记录,内容有患者ID,姓名,出入院时间。根据题目,出入院时间才是我们重点考虑的对象。
首先使用excel处理,在检索一番后 没有找到相应的处理办法,但是知乎上有个回答提示了我,’想知道每天有多少个人,让他们打卡不就行了‘ 就想到用R处理一下。
嗯,对让每个病人打卡!

首先,导入数据(没示例数据,自己生成个搞搞也不费事)
rm(list = ls())
library(data.table)
dat = data.frame(fread('khs.csv'))
dat = dat[,c(1,3,4)] #提取需要的列,id,入院时间,出院时间。
as.Date(dat$begin.time) 可以将数据转换为日期形式的数据
dat$begin.time = as.Date(dat$begin.time)
dat$end = as.Date(dat$end)
dat$id = as.character(dat$id)
dat$days = dat$end - dat$begin.time
save(dat,file = 'dat.Rdata')
此时我们已经获取了data形式的数据结构。就可以让他们打卡了。
tpm = seq.Date(from = dat$begin.time[1],to = dat$end[1],by = "day")
核心函数为seq.Date() 基础包的一个函数。可以从开始日期,到结束日期生成期间的每一天的一个时间序列。注意,要提前把NA和不符合日期结构的数据剔除一下,不然就该无限报错了。
然后写个循环,搞个list,把所有的患者都依次打卡一下
rm(list = ls())
load('dat.Rdata')
temp = list()
# dat = dat[-851,] #去除的一个NA值,报错搞了好久
for (i in 1:nrow(dat)) {
# i = 1
tpm = seq.Date(from = dat$begin.time[i],to = dat$end[i],by = "day")
tpm <- data.frame(seqtime =tpm )
temp[[i]] = tpm
}
dat_all = do.call(rbind,temp)
在这个list里面我们只保存了每个患者在院的每一天的日期,我们将每一天汇总到一起。

dat1 = data.frame(table(dat_all$seqtime))
colnames(dat1) = c('date','count')
对结果进行统计就得到了我们最想知道每天有多少人。

write.csv(dat1,file = '20220616.csv',row.names = F,col.names = T)
save(dat1,file = 'dat_all.Rata')
dat2 = dat1[dat1$count>=15,]
length(dat2$date)
[1] 1063
然后把每天都大于等于15 人的天数挑出来,就得到了想要的结果。然后交给领导就行了,交之前记得美化一下。
欸,本来想复制一下就能传过来,结果简书丑的一批,看我的语雀吧
https://www.yuque.com/docs/share/bcf42abb-ebe7-455f-a3a5-855898def2ef?#
网友评论