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

R语言结合多列条件阈值与缺失值规则实现随访诊断分类

R随访诊断逻辑编码实现需求

基础数据集

df <- data.frame(PatientID = c("0002" ,"0002", "0005", "0005" ,"0009" ,"0009" ,"0018", "0018" ,"0039" ,"0039" , "0043" ,"0043", "0046", "0046" ,"0048" ,"0048"),
                 sex= c("F", "F", "M", "M", "F", "F", "M", "M","F", "F",  "M", "M",  "M", "M", "F", "F"),
                 A1 = c( 1961.810 , 929.466 , 978.166, 1005.820 , 925.752 , 969.469  ,943.398 ,  965.292 , 1996.404 ,  967.047 ,  NA , 893.428 , 921.606 , 976.192 , 929.590 , 950.493),
                 B1 = c(998.988 , NA , 1998.680 , NA , 1020.560 ,  955.540 , 1911.606 , 964.039   ,  988.087 , 1902.367 , 959.338 ,1029.050 , 1987.374 ,1066.400  ,957.512 , 917.597),
                 C1 = c( 1987.140 , 961.810 , 929.466 , 978.166, 969.469 , 943.398  ,936.034,  965.292 , 996.404 , 1920.610 , 967.047, 913.517 , 893.428 , 921.606 , 929.590  ,950.493), 
                 D1 = c( 1961.810 , 929.466 , 978.166, 1005.820 , 925.752 , 969.469  ,1943.398 ,  965.292 , 996.404 ,  967.047 ,  NA , 1893.428 , 921.606 , 976.192 , 929.590 , 950.493),
                 E1 = c(1006.330, 1028.070 ,  954.274 ,1005.910  ,949.969 , 992.820 ,934.407 , 948.913 ,    961.375  ,955.296 , 961.128  ,998.119 ,1009.110 , 994.891 ,1000.170  ,982.763),
                 G1= c(987.140 , 961.810 , 929.466 , 978.166, 969.469 , 943.398  ,936.034,  965.292 , 996.404 , 920.610 , 967.047, 913.517 , 893.428 , 921.606 , 1929.590  ,950.493),
                 A2 = c(NA , 977.146 , NA , 964.315 ,NA , 952.311 , NA , NA , 947.465 , 902.852 ,  NA  ,NA , 930.141 ,1007.790 , NA , 999.414),
                 B2 = c(1998.988 , NA , 1998.680 , NA , NA ,  955.540 , NA , 964.039   ,  988.087 , 1902.367 , NA ,1029.050 , NA ,1066.400  ,NA , 917.597),
                 C2 = c( NA , NA , NA , NA, 969.469 , NA  ,936.034,  965.292 , NA , 1920.610 , 967.047, NA , 1893.428 , 921.606 , 929.590  ,950.493), 
                 D2 = c( 961.810 , NA , 978.166, NA , 925.752 , NA  ,943.398 ,  1965.292 , NA ,  1967.047 ,  NA , 1893.428 , 921.606 , 976.192 , NA , 1950.493),
                 E2 = c(1006.330, 1028.070 ,  NA ,1005.910  ,949.969 , 992.820 ,1934.407 , 948.913 ,    961.375  ,955.296 , NA  ,998.119 ,NA , 994.891 ,1000.170  ,982.763),
                 G2= c(NA , 958.990 , 924.680 , 955.927 , NA , NA  ,973.348 , 984.392 , NA , NA , 995.368 , 1994.997 ,  979.454 , 952.605 ,NA , 956.507), stringsAsFactors = F)

现有逻辑说明

已实现随访1的诊断规则,指标为A1/B1/C1/D1/E1/G1:

  • 女性阈值为1004,男性阈值为986
  • 单患者有3个及以上指标超过对应阈值,诊断为Yes,否则为No
    现有实现代码:
library(dplyr)
cols_f1 <- c("A1","B1","C1","D1","E1","G1")
df$sex <- as.factor(df$sex)
df <- df %>% 
  mutate(diag1 = ifelse(sex == "F" & (rowSums(.[cols_f1] > 1004, na.rm = TRUE) >=3) ,'Yes',
                        ifelse(sex == "M" & (rowSums(.[cols_f1] > 986, na.rm = TRUE) >=3) ,'Yes','No')))

新增需求

基础随访2诊断规则

与随访1规则一致,指标为A2/B2/C2/D2/E2/G2,初步诊断为diag2_raw。

基础分类规则

原计划按两次诊断结果分为4类:

  • 随访1Yes+随访2Yes:ongoing(持续患病)
  • 随访1Yes+随访2No:resolved(已痊愈)
  • 随访1No+随访2Yes:new onset(新发病)
  • 随访1No+随访2No:never(从未患病)

例外规则(新增NPA分类)

需新增*无法评估(NPA)*分类,满足以下条件时触发:

  1. 前置条件:随访1的C1、D1、E1三个指标均超过对应性别阈值,且随访2的C2为NA
  2. 判定规则:
    • 若随访2初步诊断diag2_raw为No,则随访2诊断调整为NPA
    • 若随访2初步诊断diag2_raw为Yes,则保持Yes不变,分类仍为ongoing

完整实现代码

library(dplyr)
# 定义指标列
cols_f1 <- c("A1","B1","C1","D1","E1","G1")
cols_f2 <- c("A2","B2","C2","D2","E2","G2")
# 转换性别为因子
df$sex <- as.factor(df$sex)
# 逐步计算诊断和分类
df_res <- df %>%
  # 1. 计算随访1诊断
  mutate(diag1 = case_when(
    sex == "F" & rowSums(.[cols_f1] > 1004, na.rm = T) >=3 ~ "Yes",
    sex == "M" & rowSums(.[cols_f1] > 986, na.rm = T) >=3 ~ "Yes",
    T ~ "No"
  )) %>%
  # 2. 计算随访2基础诊断
  mutate(diag2_raw = case_when(
    sex == "F" & rowSums(.[cols_f2] > 1004, na.rm = T) >=3 ~ "Yes",
    sex == "M" & rowSums(.[cols_f2] > 986, na.rm = T) >=3 ~ "Yes",
    T ~ "No"
  )) %>%
  # 3. 判断是否满足NPA前置条件:C1/D1/E1均超标 + C2为NA
  mutate(npa_condition = (
    (sex == "F" & C1>1004 & D1>1004 & E1>1004) | 
    (sex == "M" & C1>986 & D1>986 & E1>986)
  ) & is.na(C2)) %>%
  # 4. 调整随访2最终诊断
  mutate(diag2 = case_when(
    npa_condition & diag2_raw == "No" ~ "NPA",
    T ~ diag2_raw
  )) %>%
  # 5. 生成最终分类
  mutate(final_class = case_when(
    diag1 == "Yes" & diag2 == "Yes" ~ "ongoing",
    diag1 == "Yes" & diag2 == "No" ~ "resolved",
    diag1 == "No" & diag2 == "Yes" ~ "new onset",
    diag1 == "No" & diag2 == "No" ~ "never",
    diag2 == "NPA" ~ "NPA"
  ))

代码说明

  • 用case_when替代多层ifelse,可读性更强
  • 用列名而非列序号指定指标,避免列顺序变动导致逻辑错误
  • 单独拆分NPA判断逻辑,方便后续规则调整
  • 所有中间变量(diag1/diag2_raw/npa_condition)均保留,方便核对计算结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:48:03