You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用通用等价映射(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:15:02