R stringr如何查找分号分隔的Diagnosis列字符串中指定疾病的位置
R语言疾病登记数据目标诊断匹配解决方案
可以通过stringr包的正则匹配功能实现无需拆分列的位置查找,性能远高于全列拆分方案,适合大体量数据集。
核心原理
通过统计目标诊断前的分号数量直接计算其在诊断列表中的顺序位置,避免拆分整个Diagnosis列产生的额外内存占用和计算开销。
实现代码
library(tidyverse) # 1. 定义目标诊断 target_diagnosis <- "结肠癌" # 预编译匹配模式,提升大数据集下的匹配效率 target_pattern <- fixed(target_diagnosis) # 2. 批量生成所需变量 processed_df <- raw_df %>% mutate( # 二分类标识:是否存在目标诊断 has_target_diag = str_detect(Diagnosis, target_pattern), # 目标诊断的顺序位置(多个匹配时取首次出现的位置) target_pos = ifelse( has_target_diag, str_count(str_extract(Diagnosis, paste0(".*?", target_pattern)), ";") + 1, NA_integer_ ), # 提取对应位置的诊断日期 target_diag_date = pmap_chr( list(pos = target_pos, date_cols = c_across(starts_with("诊断") & ends_with("日期"))), function(pos, date_cols) ifelse(is.na(pos), NA_character_, date_cols[pos]) ) )
代码说明
- 匹配使用
fixed()模式:避免诊断名称中包含正则特殊字符导致的匹配错误,同时比默认正则匹配性能更高。 - 位置计算逻辑:第一个诊断前无分号,分号数为0对应位置1,第二个诊断前有1个分号对应位置2,以此类推,不需要拆分整个Diagnosis列生成多列。
- 日期列自动匹配:通过
c_across()批量选中所有诊断日期列,按计算出的位置直接取值,不需要手动枚举所有日期列名。
可选性能优化方案
如果数据集规模超过100万行,可改用data.table框架搭配stringr函数,整体运算速度可提升30%~50%。
内容的提问来源于stack exchange,提问作者Jakub Morze
相关产品推荐
相关产品推荐

