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

如何基于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匹配任意一个编码,就返回TRUE
  • as.integer():将布尔值转换为0(FALSE)和1(TRUE),得到需要的标记向量

内容的提问来源于stack exchange,提问作者hoon99

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:35:18