如何基于多规则多变量在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)
实现逻辑说明
- 行级统计量:通过
rowSums结合列前缀匹配,批量计算每行的确诊、治疗、诊断缺失情况,避免逐个列判断 - 规则映射:
- 优先处理无确诊的情况(返回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
相关产品推荐
相关产品推荐

