如何基于BurnData的部位指示变量创建复合分类指示变量?
合并BurnData中部位指示变量的解决方案
我来帮你搞定这个变量合并的问题!用dplyr完全可以实现你的需求,我给你写一段清晰的代码,还会拆解每一步的逻辑:
完整代码实现
library(dplyr) # 先定义需要合并的部位变量列表,方便后续维护修改 site_variables <- c("head", "buttock", "trunk", "upper leg", "lower leg", "respiratory tract") # 生成新的指示变量 BurnData <- BurnData %>% mutate( # 计算每个观测中部位变量的1的总数,用来判断是全0、单个1还是组合情况 site_total = rowSums(across(all_of(site_variables))), # 按照你的规则匹配生成新变量site_group site_group = case_when( # 所有部位均为0 site_total == 0 ~ 0, # 仅head为1 site_total == 1 & head == 1 ~ 1, # 仅buttock为1 site_total == 1 & buttock == 1 ~ 2, # 仅trunk为1 site_total == 1 & trunk == 1 ~ 3, # 仅upper leg为1 site_total == 1 & `upper leg` == 1 ~ 4, # 仅lower leg为1 site_total == 1 & `lower leg` == 1 ~ 5, # 仅respiratory tract为1(如果你原本想对应7,直接把数字改成7就行) site_total == 1 & `respiratory tract` == 1 ~ 6, # 存在任意组合的情况 site_total > 1 ~ 8 ) # 要是不需要中间变量site_total,就在这里加 %>% select(-site_total) 删掉它 )
代码逻辑拆解
- 统一管理变量:用
site_variables把要处理的部位变量列在一起,后续如果要调整变量范围,只需要修改这个列表,不用动后面的计算逻辑,更灵活。 - 判断变量类型:
rowSums(across(all_of(site_variables)))会逐行统计这些部位变量里1的数量,帮我们快速区分三种情况:全0、单个1、多个1。 - 规则匹配赋值:
case_when是dplyr里处理多条件判断的神器,我们严格按照你给定的规则逐一匹配:- 总和为0时,新变量设为0;
- 总和为1且对应部位为1时,匹配对应的编码;
- 总和大于1时,直接设为8(对应任意组合的情况)。
你的样本数据测试结果
用你提供的前6行数据运行代码,得到的site_group结果如下:
- 第1行:部位变量总和为2 → 8
- 第2行:仅trunk为1 → 3
- 第3行:部位变量总和为2 → 8
- 第4行:部位变量总和为2 → 8
- 第5行:部位变量总和为4 → 8
- 第6行:部位变量总和为2 → 8
完全符合你的规则要求!
内容的提问来源于stack exchange,提问作者user1607
相关产品推荐
相关产品推荐

