如何用case_when基于前缀匹配为R数据框创建分类列?
解决方案:基于前缀匹配的ICD-10编码分类
针对你的需求,下面提供两种高效的实现方式,解决3位/4位编码的前缀匹配分类问题:
方法一:提取前缀后用完全匹配(高效推荐)
你的编码只有3位或4位两种形式,核心分类依据是前3位编码,因此可以先提取CAUSABAS的前3位,再用%in%匹配预定义分类向量,这种方法对大型数据框性能更友好。
示例代码:
library(dplyr) # 示例预定义分类向量(根据你的实际向量调整) doen_cardio <- c("I00", "I01", "I10", "I11") arbov <- c("A90", "A91", "B50") outras_doen <- c("J00", "J01") # 生成分类列 sim <- sim %>% mutate( # 提取前3位作为匹配前缀 causa_prefix = substr(CAUSABAS, 1, 3), grupo_causa_basica = case_when( causa_prefix %in% doen_cardio ~ "Doenças Cardiovasculares", causa_prefix %in% arbov ~ "Doenças Arbovíricas", causa_prefix %in% outras_doen ~ "Outras Doenças", # 未匹配的编码归为其他类 TRUE ~ "Não Classificado" ) ) # 可选:删除临时前缀列 sim <- sim %>% select(-causa_prefix)
方法二:正则表达式前缀匹配(灵活通用)
如果需要处理非固定长度的前缀规则,可使用正则表达式锚定开头,结合str_detect实现多前缀匹配。
示例代码:
library(dplyr) library(stringr) # 预定义分类向量同前 doen_cardio <- c("I00", "I01", "I10", "I11") arbov <- c("A90", "A91", "B50") outras_doen <- c("J00", "J01") sim <- sim %>% mutate(grupo_causa_basica = case_when( # 匹配任意以doen_cardio中编码开头的记录 str_detect(CAUSABAS, paste0("^(", paste(doen_cardio, collapse = "|"), ")")) ~ "Doenças Cardiovasculares", # 匹配虫媒病毒病相关编码 str_detect(CAUSABAS, paste0("^(", paste(arbov, collapse = "|"), ")")) ~ "Doenças Arbovíricas", # 匹配其他分类 str_detect(CAUSABAS, paste0("^(", paste(outras_doen, collapse = "|"), ")")) ~ "Outras Doenças", TRUE ~ "Não Classificado" ))
关键注意事项
- 匹配顺序:
case_when按代码顺序匹配第一个满足条件的分类,若存在编码前缀重叠的情况,将优先级高的分类放在前面。 - 格式一致性:确保预定义向量中的编码与
CAUSABAS的格式完全一致(如大小写、无额外空格),避免匹配失败。 - 性能优化:方法一的
substr操作比正则表达式更快,适合处理microdatasus导出的大型数据集。
内容的提问来源于stack exchange,提问作者Danilo Imbimbo
相关产品推荐
相关产品推荐

