如何使用通用等价映射(GEM)将ICD-9编码转换为ICD-10编码
引自维基百科:
国际疾病分类(ICD)是流行病学、健康管理和临床场景下全球通用的诊断工具。
简而言之,ICD是一套编码体系,可对疾病进行无歧义的标准化描述。
我需要将使用第9版ICD(ICD-9)的医疗数据库转换为采用第10版ICD(ICD-10)的版本,可从美国疾病控制与预防中心(CDC)官网获取两个版本的映射文件。
转换的第一个难点在于,部分单个ICD-9编码可对应多个同义的ICD-10编码;更复杂的问题是,部分编码需要映射为2~3个ICD-10编码的组合(最多3个)。
为体现这种映射复杂度,CDC提供的映射文件中,编码8190的对应关系如下:
| `ICD-9` | `ICD-10` | quality | |---------+-----------+---------| | "8190" | "S4291XA" | 10111 | | "8190" | "S5291XA" | 10111 | | "8190" | "S4292XA" | 10112 | | "8190" | "S5292XA" | 10112 | | "8190" | "S4290XA" | 10121 | | "8190" | "S5290XA" | 10121 | | "8190" | "S2220XA" | 10122 | | "8190" | "S2249XA" | 10123 |
quality列为5位标识位,各位含义如下:
- 第1位:1代表非精确匹配
- 第2位:1代表无匹配项
- 第3位:1代表需通过多编码组合完成映射
- 第4位:场景编号
- 第5位:选项列表编号
每个场景可拆分为目标体系的2个或多个选项列表,应用映射时需要将这些列表的编码作为关联单元组合,才能匹配源系统组合编码的等价语义。选项列表包含1个或多个目标体系编码,对应源编码的部分语义,需要从同一场景的每个选项列表中各选1个编码组合,才能完全匹配源ICD-9编码的语义。
我还有一个额外约束:仅保留ICD-10编码的前4位,因此我已将数据处理为如下格式:
| `ICD-9` | `ICD-10` | quality | 4-char ICD-10 | scenario | choice list | |---------+-----------+---------+---------------+----------+-------------| | "8190" | "S4291XA" | 10111 | "S429" | 1 | 1 | | "8190" | "S5291XA" | 10111 | "S529" | 1 | 1 | | "8190" | "S4292XA" | 10112 | "S429" | 1 | 2 | | "8190" | "S5292XA" | 10112 | "S529" | 1 | 2 | | "8190" | "S4290XA" | 10121 | "S429" | 2 | 1 | | "8190" | "S5290XA" | 10121 | "S529" | 2 | 1 | | "8190" | "S2220XA" | 10122 | "S222" | 2 | 2 | | "8190" | "S2249XA" | 10123 | "S224" | 2 | 3 |
我还需要使用tidyverse的tibble格式输出,因为需要在输出数据框中使用嵌套列表,输出数据框格式如下:
|--------+-------------+----------------------+-------------------------+---------------------------------| | ICD-9 | Nb of match | One code matches | Two codes matches | Three codes matches | |--------+-------------+----------------------+-------------------------+---------------------------------| | "8190" | 6 | list("S429", "S529") | list(c("S429", "S529")) | list(c("S429", "S222", "S224"), | | | | | | c("S529", "S222", "S224")) | |--------+-------------+----------------------+-------------------------+---------------------------------|
我们得到2个单编码匹配结果、仅1个双编码匹配结果,是因为当使用截断后的编码探索scenario == 1的场景时,共有4种选项组合方式:
S429 S429 => S429 S429 S529 S529 S429 (与上一组合等价) S529 S529 => S529
输入数据集
输入数据集如下:
library(tibble) input <- structure(list(`ICD-9` = c("00320", "00589", "00589", "01480","01480", "8190", "8190", "8190", "8190", "8190", "8190", "8190", "8190", "36570"), `ICD-10` = c("A0220", "A054", "A058", "A1832", "A1839", "S4291XA", "S5291XA", "S4292XA", "S5292XA", "S4290XA", "S5290XA", "S2220XA", "S2249XA", "NoDx"), quality = c("00000", "10000", "10000", "10000", "10000", "10111", "10111", "10112", "10112", "10121", "10121", "10122", "10123", "11000")), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -14L), spec = structure(list(cols = list(X1 = structure(list(), class = c("collector_character", "collector")), X2 = structure(list(), class = c("collector_character", "collector")), X3 = structure(list(), class = c("collector_character", "collector"))), default = structure(list(), class = c("collector_guess", "collector")), skip = 0), class = "col_spec"))
数据集预览:
# A tibble: 14 x 3 `ICD-9` `ICD-10` quality <chr> <chr> <chr> 1 00320 A0220 00000 2 00589 A054 10000 3 00589 A058 10000 4 01480 A1832 10000 5 01480 A1839 10000 6 8190 S4291XA 10111 7 8190 S5291XA 10111 8 8190 S4292XA 10112 9 8190 S5292XA 10112 10 8190 S4290XA 10121 11 8190 S5290XA 10121 12 8190 S2220XA 10122 13 8190 S2249XA 10123 14 36570 NoDx 11000
预期输出
预期输出如下:
output <- tibble(`ICD-9` = c("00320", "00589", "01480", "8190", "36570"), `Nb of match` = c(1, 2, 1, 5, 0), `One code matches` = list(list("A0220"), list("A054", "A058"), list("A183"), list("S429", "S529"), NA), `Two codes matches` = list(NA, NA, NA, list(c("S429", "S529")), NA), `Three codes matches` = list(NA, NA, NA, list(c("S429", "S222", "S224"), c("S529", "S222", "S224")), NA))
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

