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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:03:16