R语言跨多DX诊断列按逻辑条件筛选患者并生成分类标记列
多DX列跨编码条件分类实现
原有代码错误说明
代码无法达到预期效果的核心原因:
- 向量构造错误:
c()内元素需用逗号分隔,|是逻辑或运算符,不能作为向量元素分隔符,运行时会直接抛错- 函数适配错误:
mutate_at用于逐列变换,无法实现跨列的行级整体判断- 逻辑方向错误:需求是对单条患者记录的所有DX列做整体命中校验,而非对单个DX列的值做条件匹配,且未处理列内NA值导致的判断偏差
可运行实现方案
编码规则预定义
- 需命中的第一组编码:
c("05", "5", "02", "2", "62") - 需命中的第二组编码:
c("87", "087", "0086", "089", "89")
方案1:dplyr 通用写法(适配任意数量DX列)
自动识别所有以DX开头的列,无需手动枚举DX1、DX2……DX10的列名,适配常规分析场景:
library(dplyr) code_group1 <- c("05", "5", "02", "2", "62") code_group2 <- c("87", "087", "0086", "089", "89") Patientdata <- Patientdata %>% mutate( Diagnosis = case_when( if_any(starts_with("DX"), ~ .x %in% code_group1) & if_any(starts_with("DX"), ~ .x %in% code_group2) ~ "Yes", TRUE ~ "" ) )
方案2:基础R 极速写法(适配超大规模数据集)
无第三方包依赖,内存占用低、运行速度快,适合千万行级别的超大规模患者数据库:
# 自动识别所有DX列的位置 dx_col_index <- grep("^DX", colnames(Patientdata)) # 批量计算行级命中结果 Patientdata$Diagnosis <- "" hit_group1 <- apply(Patientdata[, dx_col_index], 1, \(row) any(row %in% code_group1, na.rm = TRUE)) hit_group2 <- apply(Patientdata[, dx_col_index], 1, \(row) any(row %in% code_group2, na.rm = TRUE)) Patientdata$Diagnosis[hit_group1 & hit_group2] <- "Yes"
效果验证
上述代码运行后生成的Diagnosis列与示例期望输出完全一致,无需调整列顺序、修改单条判断逻辑,可直接复用。
内容的提问来源于stack exchange,提问作者Mike J
相关产品推荐
相关产品推荐

