R语言-核对病案首页内容
本文3778字〡5图
2019年1月30日,国办4号文件《国务院办公厅关于加强三级公立医院绩效考核工作的意见》发布,拉开了三级公立医院“赶考”的大幕。《意见》中提出绩效考核结果的应用场景:作为公立医院发展规划、重大项目立项、财政投入、经费核拨、绩效工资总量核定、医保政策调整的重要依据,同时与医院评审评价、国家医学中心和区域医疗中心建设以及各项评优评先工作紧密结合。
2019年4月17日,国家卫生健康委办公厅、国家中医药局办公室联合发布了《关于启动2019年全国三级公立医院绩效考核有关工作的通知》,明确了数据上传和填报要求、时间节点,正式启动这项重大的开创性工作。
全国三级公立医院(含三级公立中医医院)要按照要求认真完成住院病案首页数据填报及上传工作,规范使用2011年修订版住院病案首页;使用统一的疾病编码和手术操作编码;使用统一的上传接口标准;加强住院病案首页质量管理。
各地卫生健康行政部门要充分认识提高住院病案首页数据质量、编码字典库转换的重要意义,建立协调推进机制,强化组织领导,保障住院首页数据的上传质量。
国家病案管理质控中心、中国中医科学院中医药数据中心、各省级病案管理质控中心要组织开展住院病案首页质量督导检查、医疗机构编码转换质量抽查,监督指导属地医疗机构将首页数据质控和上传工作落到实处。
1三级公立医院绩效考核首页数据采集接口标准
现行三套首页数据采集接口标准分别为:《三级公立医院绩效考核住院病案首页数据采集质量与接口标准》;国家医疗质量监测系统《住院病案首页数据采集接口标准》;省卫生计生综合统计信息平台《病案首页数据接口规范》。
△三级公立医院绩效考核病案首页采集的642个字段
2为什么要核对病案首页内容?
全国三级公立医院绩效考核首页数据通过前置机程序上传至HQMS系统,系统自带了23个数据关联校验规则,主要是对数据逻辑性及关联性进行校验,平台及校验规则如下所示:
△HQMS平台
△首页关联规则校验
但是,病案首页数据上传后无法查看形成的统计报表,各字段是否真实反映院内首页内容,还是未知的。由于A医院首页系统的数据库表结构较为复杂,由第三方厂家维护,提供给医院的是带有综合查询功能的GUI界面。加之,出院患者接近6万,整个表的元素达到3800多万(60000*642),在WPS软件中进行数据筛选或者分类汇总显得有些吃力。
因此考虑将数据导入R语言进行核对,一方面可以采用查询、筛选函数;另一方面考虑采用统计函数,然后与院内首页GUI查询结果比对。
3在R语言中应用SQL语句查询、筛选数据
原计划是将数据包导入到MySQL可视化管理工具Navicat中,无奈导入过程不断报错,遂放弃。但是在R语言中可以通过sqldf包实现SQL语句查询、筛选。如果对首页系统的数据库比较熟悉,也可通过RMySQL包连接到MySQL数据库。
数据读入、加载sqldf包,如下所示:
mydata <- read.csv(file = 'C:/Users/Administrator/Desktop/hqmsts_2019M1-82.csv') #读入首页csv数据
head(mydata) #查看前6行数据
library(sqldf) #载入sqldf包
下面三个查询分别为:年龄在50岁到80岁之间的病案;门急诊诊断含有肺炎的病案;出院病房为儿科III病区和肾脏病内科的病案。语句和SQL一样,都是使用Select语句检索,如下所示:
sqldf('select * from mydata where A14 between 50 and 80') #查询年龄在50岁到80岁之间的病案
A01 A02 A46C A12C A14 A21C A38C A19C A33C B11C B13C B14 B16C B17 B20 C01C C02N
1 888888888 XXXX医院 9.0 1 60 2 90 1 2 1 28 重症医学科 403 脊柱外科 3 S12.200x041 颈椎骨折C6
2 888888888 XXXX医院 3.1 2 52 2 90 1 1 1 28 重症医学科 28 重症医学科 3 J96.900 呼吸衰竭
3 888888888 XXXX医院 1.1 2 78 2 90 11 3 2 28 重症医学科 306 肾脏病内科 1 N18.001 慢性肾脏病5期
4 888888888 XXXX医院 7.0 1 69 2 27 1 2 1 28 重症医学科 28 重症医学科 3 T60.001 有机磷中毒
sqldf('select * from mydata where C02N like '%肺炎%'') #查询门急诊诊断含有肺炎的病
A01 A02 A46C A12C A14 A21C A38C A19C A33C B11C B13C B14 B16C B17 B20 C01C C02N
1 888888888 XXXX医院 2.1 2 0 1 90 1 5 2 28 重症医学科 7 儿科Ⅲ病区 7 J18.000x001 喘息性支气管肺炎
2 888888888 XXXX医院 7.0 1 0 1 90 1 5 2 28 重症医学科 28 重症医学科 2 J18.000x001 喘息性支气管肺炎
3 888888888 XXXX医院 7.0 1 0 1 90 1 5 1 28 重症医学科 28 重症医学科 1 J18.903 重症肺炎
sqldf('select * from mydata where B17 in ('儿科Ⅲ病区', '肾脏病内科')') #查询出院病房为儿科III病区和肾脏病内科的病案
A01 A02 A46C A12C A14 A21C A38C A19C A33C B11C B13C B14 B16C B17 B20 C01C C02N
1 888888888 XXXX医院 2.1 2 0 1 90 1 5 2 28 重症医学科 7 儿科Ⅲ病区 7 J18.000x001 喘息性支气管肺炎
2 888888888 XXXX医院 1.1 2 78 2 90 11 3 2 28 重症医学科 306 肾脏病内科 1 N18.001 慢性肾脏病5期
subset(mydata, A12C == 2) #年龄在50岁到80岁之间的病案
subset(mydata, A14 >= 50 & A14 <= 80) #年龄在50岁到80岁之间的病案
subset(mydata, grepl('肺炎', C02N)) #门急诊诊断含有肺炎的病案
feiyan1 <- sqldf('select * from mydata where C02N like '%肺炎%'', row.names = TRUE) #查询门急诊诊断含有肺炎的病案
feiyan2 <- subset(mydata, grepl('肺炎', C02N)) #查询门急诊诊断含有肺炎的病案
identical(a1, a) #sqldf()和subset()查询一致性判断
另外,也可以使用聚合函数汇总表中的数据,如AVG()、COUNT()、MAX()、MIN()、SUM(),将结果与病案首页系统查询结果比对。
4R语言统计函数与频数表函数的方法核对
数据读入R语言,并查看前6行,具体如下:
library(readxl) #加载reaxl包
mydata <- read.csv(file = 'C:/Users/Administrator/Desktop/hqmsts_2019M1-81.csv') #读入首页csv数据
head(mydata) #查看前6条患者信息
attach(mydata) #将数据添加到R的搜索路径
对于定性类型的字段(变量)使用频数表生成函数table() ,如字段B34C为患者离院方式,当该字段值域=3时,表示医嘱转社区,也是国家提取的重要字段,反映住院患者下转人次,如下所示:
table(B34C) #统计离院方式频数
B34C
1 2 3 4 5 9
74537 319 280 2941 457 217
summary(D23x01) #统计抗菌药物费用
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 70.06 496.72 511.63 56170.94
write.csv(data.frame(table(C03C)), file = 'zhenduan.csv', row.names = TRUE) #导出出院主要诊断编码频数表
write.csv(data.frame(table(C14x01C)), file = 'shoushu.csv', row.names = TRUE) #导出主要手术操作编码频数表
write.csv(data.frame(table(C09C)), file = 'bingli.csv', row.names = TRUE) #导出病理诊断编码频数表
△出院主要诊断频数统计表
完整代码:
library(readxl) #加载reaxl包
mydata <- read.csv(file = 'xxx.csv') #读入首页csv数据
head(mydata) #查看前6条患者信息
attach(mydata) #将数据添加到R的搜索路径
table(B34C) #统计离院方式频数
summary(D23x01) #统计抗菌药物费用
write.csv(data.frame(table(C03C)), file = 'zhenduan.csv', row.names = TRUE) #导出出院主要诊断编码频数表
write.csv(data.frame(table(C14x01C)), file = 'shoushu.csv', row.names = TRUE) #导出主要手术操作编码频数表
write.csv(data.frame(table(C09C)), file = 'bingli.csv', row.names = TRUE) #导出病理诊断编码频数表
mydata <- read.csv(file = 'xxx.csv') #读入首页csv数据
head(mydata) #查看前6行数据
library(sqldf) #载入sqldf包
sqldf('select * from mydata where A12C = 2 ', row.names = TRUE) #查询性别为男的病案
sqldf('select * from mydata where A14 between 50 and 80') #查询年龄在50岁到80岁之间的病案
sqldf('select * from mydata where C02N like '%肺炎%'') #查询门急诊诊断含有肺炎的病案
sqldf('select * from mydata where B17 in ('儿科Ⅲ病区', '肾脏病内科')') #查询出院病房为儿科III病区和肾脏病内科的病案
subset(mydata, A12C == 2) #年龄在50岁到80岁之间的病案
subset(mydata, A14 >= 50 & A14 <= 80) #年龄在50岁到80岁之间的病案
subset(mydata, grepl('肺炎', C02N)) #门急诊诊断含有肺炎的病案
feiyan1 <- sqldf('select * from mydata where C02N like '%肺炎%'', row.names = TRUE) #查询门急诊诊断含有肺炎的病案
feiyan2 <- subset(mydata, grepl('肺炎', C02N)) #查询门急诊诊断含有肺炎的病案
identical(a1, a) #sqldf()和subset()查询一致性判断