如何在R语言中扩展ICD-10字母数字编码范围?
解决ICD-10编码范围展开问题
问题描述
需要将带范围的ICD-10医学字母数字编码字符串,展开为包含所有具体编码的列表或字符串。示例输入如下:
test <- "F11.120-F11.129, F11.220-F11.229, F11.920-F11.929, F12.120-F12.129, F12.220-F12.229, F12.920-F12.929, F13.120-F11.129, F13.220-F11.229, F13.920-F11.929"
期望输出为类似 "F11.120, F11.121, F11.122,...,F13.929" 的包含所有具体编码的字符串。
用户已完成编码拆分的初步步骤,但在循环生成序列部分遇到困难:
library(stringr) library(dplyr) test <- strsplit(test, ",")[[1]] codes <- str_split(test, "-", simplify = T) nums <- codes %>% as.data.frame() %>% mutate(prefix = as.character(sub("\\..*", '',.[,1])), start_num = as.numeric(sub('.*\\.', '', .[,1])), end_num = as.numeric(sub('.*\\.', '', .[,2])) )
解决方案
基于已有的拆分结果,我们可以通过逐行处理每个编码范围,生成完整的编码序列,最后合并为目标字符串:
library(stringr) library(dplyr) library(tidyr) # 初始处理(优化拆分逻辑) test <- "F11.120-F11.129, F11.220-F11.229, F11.920-F11.929, F12.120-F12.129, F12.220-F12.229, F12.920-F12.929, F13.120-F11.129, F13.220-F11.229, F13.920-F11.929" test <- strsplit(test, ",\\s*")[[1]] # 自动去除逗号后的空格 codes <- str_split(test, "-", simplify = T) nums <- codes %>% as.data.frame() %>% mutate( prefix = sub("\\..*", '', V1), # 提取编码的前缀(小数点前部分) start_num = as.numeric(sub('.*\\.', '', V1)), end_num = as.numeric(sub('.*\\.', '', V2)) ) # 逐行生成编码序列 expanded_codes <- nums %>% rowwise() %>% mutate( # 生成数字序列并补前导零,确保小数点后保持3位格式 code_sequence = list(sprintf("%s.%03d", prefix, seq(start_num, end_num))) ) %>% unnest(code_sequence) %>% pull(code_sequence) # 提取为编码向量 # 合并为目标字符串 result <- paste(expanded_codes, collapse = ", ") print(result)
扩展说明
针对示例输入中存在的前缀不一致范围(如F13.120-F11.129),如果需要同时展开前缀的数字范围(比如从F11到F13),可以补充前缀拆分逻辑:
nums <- codes %>% as.data.frame() %>% mutate( # 拆分前缀的字母和数字部分 prefix_char_V1 = str_extract(V1, "^[A-Z]"), prefix_num_V1 = as.numeric(str_extract(V1, "(?<=^[A-Z])\\d+")), prefix_char_V2 = str_extract(V2, "^[A-Z]"), prefix_num_V2 = as.numeric(str_extract(V2, "(?<=^[A-Z])\\d+")), start_num = as.numeric(sub('.*\\.', '', V1)), end_num = as.numeric(sub('.*\\.', '', V2)) ) %>% rowwise() %>% mutate( # 生成前缀的数字范围序列 prefix_sequence = list(sprintf("%s%02d", prefix_char_V1, seq(prefix_num_V1, prefix_num_V2))), # 生成小数点后的数字范围序列 num_sequence = list(seq(start_num, end_num)) ) %>% unnest(c(prefix_sequence, num_sequence)) %>% mutate( code_sequence = sprintf("%s.%03d", prefix_sequence, num_sequence) ) %>% pull(code_sequence)
这段代码会生成前缀从起始到结束、同时小数点后数字从起始到结束的所有组合编码。
内容的提问来源于stack exchange,提问作者orion34
相关产品推荐
相关产品推荐

