如何用ifelse()/case_when()分组CPT Code且避免重复变量?
问题分析与解决方案
错误根源
你的代码中使用CPT Code == (xxx | xxx)的写法存在语法逻辑错误:R会先对括号内的数值执行逻辑或运算(|),非零数值在逻辑判断中会被视为TRUE,因此整个括号的结果是TRUE。实际执行的是CPT Code == TRUE,只有当CPT Code等于1时才会匹配,最终导致所有数据都被归类为Other。
正确实现方式
要避免重复书写CPT Code == xxxxx,同时正确完成分组,推荐结合%in%运算符和case_when()函数(比嵌套ifelse()更简洁易读):
方法1:提前定义手术组代码清单(适合长列表,易维护)
library(dplyr) library(janitor) # 定义各手术组对应的CPT代码集合 pancreatectomy_cpts <- c(48120, 48140, 48145, 48146, 48148) colectomy_cpts <- c(44140, 44141, 44143, 44144) proctectomy_cpts <- c(44155, 44156, 44157, 44158, 44211) df <- df %>% mutate( `CPT Code` = as.numeric(`CPT Code`), proc_group = case_when( `CPT Code` %in% pancreatectomy_cpts ~ "Pancreatectomy", `CPT Code` %in% colectomy_cpts ~ "Colectomy", `CPT Code` %in% proctectomy_cpts ~ "Proctectomy", TRUE ~ "Other" # 未匹配到上述组别的数据归为Other ) ) tabyl(df$proc_group)
方法2:直接在case_when()中写代码向量(简短列表适用)
library(dplyr) library(janitor) df <- df %>% mutate( `CPT Code` = as.numeric(`CPT Code`), proc_group = case_when( `CPT Code` %in% c(48120, 48140, 48145, 48146, 48148) ~ "Pancreatectomy", `CPT Code` %in% c(44140, 44141, 44143, 44144) ~ "Colectomy", `CPT Code` %in% c(44155, 44156, 44157, 44158, 44211) ~ "Proctectomy", TRUE ~ "Other" ) ) tabyl(df$proc_group)
优势说明
%in%专门用于判断元素是否属于某个集合,完美替代重复的==+|写法,避免语法错误case_when()采用顺序判断结构,逻辑清晰,比多层嵌套ifelse()更易读和维护- 提前定义代码清单的方式,后续修改或扩展CPT代码时,只需调整清单变量,无需改动判断逻辑
内容的提问来源于stack exchange,提问作者Cassandra
相关产品推荐
相关产品推荐

