如何用R语言基于ICD-10代码创建哑变量,判断字段是否在C00-D48X区间
解决方案
步骤1:修正并准备数据
首先修正原始数据中的输入错误(原数据中第四个LINHAA1值为0985,应为O985),同时确保字段为字符类型而非因子:
data <- data.frame(LINHAA1 = c("B342", "C000", "D450", "O985"), LINHAA2 = c("U071", "C99", "D68X", "J061"), LINHAA3 = c("D48X", "Y098", "X223", "D640"), stringsAsFactors = FALSE)
步骤2:编写判断函数
定义函数判断单个ICD-10代码是否属于第2章(C00-D48X区间),利用字符串字典序进行范围判断:
is_chapter2 <- function(code) { if (is.na(code) || code == "") return(FALSE) code >= "C00" && code <= "D48X" }
步骤3:生成哑变量CHAPTER2
按行遍历LINHAA1至LINHAA3字段,只要任意一个代码符合条件,CHAPTER2赋值为1,否则为0:
data$CHAPTER2 <- apply(data[, c("LINHAA1", "LINHAA2", "LINHAA3")], 1, function(row) { any(sapply(row, is_chapter2)) * 1 })
验证结果
运行代码后查看输出:
print(data)
输出结果与期望一致:
LINHAA1 LINHAA2 LINHAA3 CHAPTER2 1 B342 U071 D48X 1 2 C000 C99 Y098 1 3 D450 D68X X223 1 4 O985 J061 D640 0
逻辑说明
- R语言中字符串的字典序比较完全适配ICD-10的编码规则,
C00到D48X的范围可以直接通过>=和<=判断。 apply按行处理目标字段,sapply对每个字段执行判断,any()检查是否存在符合条件的代码,最后通过*1将布尔值转换为1/0的哑变量格式。
内容的提问来源于stack exchange,提问作者Lana Meijinhos
相关产品推荐
相关产品推荐

