如何优化R代码批量将分类变量转换为指示患者是否用药的哑变量
分类变量转哑变量(按患者是否服用过药物二值化)优化方案
核心优化思路
- 无需手动拼接用药字符串、逐个判断生成列,直接利用宽表转换逻辑自动生成所有药物对应的二分类字段
- 仅保留「用户-药物」的唯一匹配关系后宽化,空值自动填充为0,完全匹配需求:只要服用过一次对应药物则取值为1,否则为0
优化后代码(tidyverse实现,兼容原使用的dplyr语法)
library(tidyverse) # 原始示例数据 id<-c(rep("A",7),rep("B",4)) medoc<-c("par","mor","mor","par","sed","sed", "sed","cur","sed","cur","sed") mydata<-data.frame(id,medoc) # 核心处理代码,无需修改即可适配任意数量的药物类型 mydata_opt <- mydata %>% distinct(id, medoc) %>% # 每个用户每种药物仅保留1条记录(代表吃过) mutate(value = 1) %>% # 吃过的标记为1 pivot_wider(names_from = medoc, values_from = value, values_fill = 0) # 宽化,没吃过的填充为0
结果验证
运行后mydata_opt输出和手动生成的结果完全一致:
| id | par | mor | sed | cur |
|---|---|---|---|---|
| A | 1 | 1 | 1 | 0 |
| B | 0 | 0 | 1 | 1 |
可选:基础R实现(无需加载第三方包)
# 生成交叉表后转数据框,大于0的统一转为1 mydata_base <- as.data.frame.matrix(table(unique(mydata)$id, unique(mydata)$medoc)) mydata_base[mydata_base > 0] <- 1 # 将id从行名转为正式列 mydata_base$id <- rownames(mydata_base) rownames(mydata_base) <- NULL
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

