肿瘤登记数据上报经验分享:R语言批量导入导出excel数据

肿瘤登记数据上报实践

数据处理

R

肿瘤登记

每年向国家肿瘤登记处上报当年肿瘤登记数据是每个省级肿瘤登记处的每年的工作内容,而当县区级登记处的数量很多的时候,数据整理工作变得很琐碎,这篇博文将向大家介绍如何处理肿瘤登记上报过程中的数据处理。

1 随访数据上报要求

随访数据要求上报两部分资料,第一部分是随访资料,第二部分是寿命表资料,并分别以FB和LT为表单名称保存到Excel中。

1.1 随访资料

要求上报建立登记处以来的所有癌症病例并随访至上一年末。

具体上报变量如下:

  • Registr:登记编号
  • ID: 身份识别号码
  • Sex: 性别
  • Age: 年龄
  • Birthda: 出生日期
  • Inciden: 出生日期
  • ICDO3: ICDO3解剖学部位
  • Morp: ICDO3形态学编码
  • Beha: ICDO3行为编码
  • Grad: ICDO3分级编码
  • Icd10: ICD10编码
  • Deathda: 死亡日期
  • Basi: 诊断依据
  • Trib: 民族
  • Marri: 婚姻状态
  • Mult: 是否多原发
  • Lastcontact: 最后接触日期
  • Status: 生存状态
  • Caus: 死亡原因

1.2 寿命表数据

要求上报与随访资料同年份的寿命表资料。具体变量如下:

  • 年份(Year):与随访数据库覆盖年份相同
  • 性别(Sex):合计=0,男性=1,女性=2
  • 年龄组(Age): 0, 1-, 5-, …, 80-, 85及以上, 用组段下限年龄值表示
  • 死亡数(Death):覆盖人群中的全死亡数
  • 人口数(Popu):户籍人口

2 当年发病死亡数据上报

当年发病死亡数据上报的内容要求与随访资料要求上报的变量是一样的,只不过要分为三部分:

  • 发病资料:发病日期为上报年份的所有癌症病例资料;
  • 死亡资料:死亡日期为要求上报年份的所有癌症病例资料;
  • 人口数据:要求上报年份登记处所有在地分年龄分性别户籍人口数。

3 存在问题及解决方法

河南省肿瘤登记采用网络直报信息管理系统进行日常数据的收集和管理,在进行数据上报的时候,我们需要把最新的数据分登记处按照上报格式导出就可以了,这个过程中也涉及了变量名的更改等。

首先加载相关R语言包

library(dplyr)
library(openxlsx)
library(Hmisc)
library(haven)

我们在code.mdb数据库的registry表中存储了相关登记处的信息,report2019这个变量标记了哪些登记处入选了河南省肿瘤登记年报。

## 从code字典里筛选出2019年年报纳入的登记处
registrys <- mdb.get("code.mdb",tables = c("registry")) %>% 
  filter(report2019==1) %>% 
  select(areacode,city,county)
registrys$areacode <- as.character(registrys$areacode)

通下面的程序,我们把选择需要上报的变量以及把上报变量更改为上报模板要求的变量名称。

## 读取肿瘤登记数据
canreg <- read_sas("tumorinfo.sas7bdat.zip") %>% 
  rename_all(tolower) %>%
  select(registr,indno,sex,age,birthda,inciden,topo,morp,beha,grad,autoicd10,deathda,basi,state,caus,dlc,areacode) %>%
  rename(id=indno,icdo3=topo,icd10=autoicd10,status=state,lastcontact=dlc)
1
把所有变量名改为小写字母
2
选择需要上报的变量
3
把变量名改成上报模板要求的变量名

我们通过下面的程序把寿命表数据转换成上报格式要求的形式。

## 整理寿命表数据
lifetable <- read_sas("population.sas7bdat.zip") %>% 
  rename_all(tolower) %>% 
  mutate(areacode = substr(addcode,1,6)) %>% 
  filter(areacode %in% areacodes, year >= 2008, year <= 2021) %>% 
  select(areacode,year,sex,type,p0:p85) %>%
  pivot_longer(cols = p0:p85, names_to = c("agegrp"), values_to =c("count")) %>% 
  mutate(type=ifelse(type==1,"pop","death")) %>% 
  pivot_wider(names_from = c("type"), values_from = c("count")) %>% 
  mutate(agegrp = as.numeric(gsub("[^0-9\\.]", "", agegrp)),
         sex=as.numeric(sex)) %>% 
  arrange(areacode,year,sex,agegrp)

下面的程序把随访资料和寿命表数据按照登记处的行政区划和名称保存成excel,虽然for显式循环运行效率有点低,但是对于几十个登记处的数据来说,运行速度还可以。如果数据量大的时候可以考虑使用lapply来批量导出。

for (areas in registrys$areacode){
  fb <- canreg %>% filter(areacode==areas)
  lt <- lifetable %>% filter(areacode==areas)
  county <- registrys[registrys$areacode==areas,c("county")]
  res <- list(FB=fb, LT=lt)
  write.xlsx(res,paste0("report/",areas,county,".xlsx"),colNames = TRUE)
}

以上程序运行的结果见图 图 1

图 1: 导出excel结果
陈琼博士

陈 琼

博士 副主任医师

他从事肿瘤登记与人群流行病学研究,编写肿瘤登记年报,并开发和维护个人网站。他撰写博文,分享数据分析方法、可视化技巧和自动化报告解决方案,同时学习 R 语言,开发 R 包,不断探索高效的数据处理与展示方式。 🚀

回到顶部