如何基于DataFrame的疾病编码规则生成0-1指示向量
问题描述
我正在处理如下的DataFrame:
illness1<- c(1,2,2,3,3,5,1,7,8,3) illness2<- c("a", "d", "c", "b", "e", "a", "d", "c", "b", "e") datacode1<- 1:10 datacode2<- c("a", "b", "c", "d", "e" , "f", "g", "h", "i", "j") patient_id<- 1:10 diseasecode<- 1:10 df<- data.frame(patient_id, illness1, illness2, diseasecode, datacode1, datacode2)
生成的DataFrame如下:
patient_id illness1 illness2 diseasecode datacode1 datacode2 1: 1 1 a 1 1 a 2: 2 2 d 2 2 b 3: 3 2 c 3 3 c 4: 4 3 b 4 4 d 5: 5 3 e 5 5 e 6: 6 5 a 6 6 f 7: 7 1 d 7 7 g 8: 8 7 c 8 8 h 9: 9 8 b 9 9 i 10: 10 3 e 10 10 j
每个diseasecode对应一种特定疾病,datacode1和datacode2是该疾病的编码。比如diseasecode=1代表高血压,对应编码是1和a——只要患者的illness1或illness2包含这两个编码中的任意一个,就判定该患者患有高血压。像第1行患者同时有1和a,第6行患者有a,第7行患者有1,这三行都算患高血压。
我需要生成一个长度为10的向量(或者在DataFrame里新增一列),用1表示患者患有目标疾病(比如高血压),0表示未患病。核心需求是:如何通过比较DataFrame内的值返回由0和1组成的标记向量?
解决方法
方法1:针对单一疾病的直接标记
以高血压为例,直接通过逻辑判断生成标记列:
# 提取高血压对应的编码集合 htn_codes <- unlist(df[df$diseasecode == 1, c("datacode1", "datacode2")]) # 新增标记列:匹配编码则为1,否则为0 df$has_htn <- as.integer( df$illness1 %in% htn_codes | df$illness2 %in% htn_codes )
运行后,df$has_htn的结果为:
[1] 1 0 0 0 0 1 1 0 0 0
方法2:通用化函数(支持多疾病标记)
如果需要对多种疾病批量标记,可以封装成通用函数:
mark_disease <- function(df, target_code) { # 获取目标疾病的所有编码 disease_codes <- unlist(df[df$diseasecode == target_code, c("datacode1", "datacode2")]) # 生成0/1标记向量 as.integer(df$illness1 %in% disease_codes | df$illness2 %in% disease_codes) } # 标记高血压 df$has_htn <- mark_disease(df, 1) # 标记diseasecode=2对应的疾病 df$has_disease2 <- mark_disease(df, 2)
核心逻辑说明
%in%:判断某值是否存在于指定编码集合中,返回布尔值(TRUE/FALSE)|:逻辑或操作,只要illness1或illness2匹配任意一个编码,就返回TRUEas.integer():将布尔值转换为0(FALSE)和1(TRUE),得到需要的标记向量
内容的提问来源于stack exchange,提问作者hoon99
相关产品推荐
相关产品推荐

