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

如何基于多规则多变量在R中创建received_treatment变量?

用tidyverse创建received_treatment变量

以下是基于tidyverse语法的实现方案,通过行级统计量结合case_when简洁覆盖所有规则:

library(tidyverse)

# 初始数据
df <- tribble(
  ~diagnosis_A, ~treatment_A, ~diagnosis_B, ~treatment_B, ~diagnosis_C, ~treatment_C,
  0, NA, 0, NA, 0, NA,
  1, 1, 0, NA, 0, NA,
  1, 0, 0, NA, 0, NA,
  1, 1, 1, 1, 0, NA,
  1, 0, 1, 0, 0, NA,
  1, 1, 1, 0, 0, NA,
  1, 0, 1, 1, 0, NA,
  1, 0, 1, 0, NA, NA,
  1, 1, 1, 0, NA, NA)

# 生成目标变量
df <- df %>%
  mutate(
    # 标记是否存在确诊(任意diagnosis列=1)
    has_diagnosis = rowSums(select(., starts_with("diagnosis_")) == 1, na.rm = TRUE) > 0,
    # 标记是否接受过至少一种治疗(任意treatment列=1)
    has_treatment = rowSums(select(., starts_with("treatment_")) == 1, na.rm = TRUE) > 0,
    # 标记是否存在诊断列缺失
    has_missing_diagnosis = rowSums(is.na(select(., starts_with("diagnosis_")))) > 0,
    # 按规则映射结果
    received_treatment = case_when(
      # 规则1:无任何确诊
      !has_diagnosis ~ NA_integer_,
      # 规则2/5:只要接受过治疗,无论是否有诊断缺失都返回1
      has_treatment ~ 1L,
      # 规则4:有确诊但未治疗,且存在诊断缺失
      has_diagnosis & !has_treatment & has_missing_diagnosis ~ NA_integer_,
      # 规则3:有确诊但未治疗,且无诊断缺失
      has_diagnosis & !has_treatment & !has_missing_diagnosis ~ 0L,
      # 兜底(理论不会触发)
      TRUE ~ NA_integer_
    )
  ) %>%
  # 移除中间辅助变量(可根据需求保留)
  select(-has_diagnosis, -has_treatment, -has_missing_diagnosis)

实现逻辑说明

  1. 行级统计量:通过rowSums结合列前缀匹配,批量计算每行的确诊、治疗、诊断缺失情况,避免逐个列判断
  2. 规则映射:
    • 优先处理无确诊的情况(返回NA)
    • 只要有治疗记录,直接返回1(覆盖规则2和规则5)
    • 未接受治疗时,根据是否存在诊断缺失分别返回NA(规则4)或0(规则3)

验证结果

运行代码后,生成的received_treatment列与目标要求完全一致:

print(df)
#> # A tibble: 9 × 7
#>   diagnosis_A treatment_A diagnosis_B treatment_B diagnosis_C treatment_C received_treatment
#>         <dbl>       <dbl>       <dbl>       <dbl>       <dbl>       <dbl>              <int>
#> 1           0          NA           0          NA           0          NA                 NA
#> 2           1           1           0          NA           0          NA                  1
#> 3           1           0           0          NA           0          NA                  0
#> 4           1           1           1           1           0          NA                  1
#> 5           1           0           1           0           0          NA                  0
#> 6           1           1           1           0           0          NA                  1
#> 7           1           0           1           1           0          NA                  1
#> 8           1           0           1           0          NA          NA                 NA
#> 9           1           1           1           0          NA          NA                  1

扩展性

代码通过列前缀(starts_with("diagnosis_")/starts_with("treatment_"))匹配列,后续新增诊断/治疗列时,只要保持相同前缀格式,无需修改代码即可自动适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:37:34