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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:20:27