R语言字符分类列按规则编码为连续值用于glm回归的实现问题
R语言分类字段数值编码实现方案
前置操作:构造样例数据集
首先补全样例数据集的完整构造代码:
TBI_df <- data.frame( TBI.crani = c(0, 0, 0, 0, 0, 0), TBI.vte = c(0, 0, 0, 0, 0, 0), TBI.FEMALE = c(0, 0, 1, 0, 1, 0), TBI.iracecat2 = c("Whites", "Whites", "Whites", "Hispanics", "Whites", "Blacks"), TBI.agecat = c("Age 47-64", "Age 29-46", "Age > 64", "Age 29-46", "Age 18-28", "Age 18-28"), TBI.nisscategory = c("NISS 21-30", "NISS 11-20", "NISS 21-30", "NISS 11-20", "NISS 11-20", "NISS 0-10"), TBI.LOS = c(5, 8, 1, 3, 19, 1), TBI.hospitalteach = c(0, 0, 1, 1, 1, 1), TBI.largebedsize = c(1, 1, 1, 1, 1, 1), TBI.CM_ALCOHOL = c(0, 0, 0, 1, 0, 0), TBI.CM_ANEMDEF = c(0, 0, 0, 0, 0, 0), TBI.CM_BLDLOSS = c(0, 0, 0, 0, 0, 0), TBI.CM_CHF = c(1, 0, 0, 0, 0, 0), TBI.CM_CHRNLUNG = c(0, 0, 0, 0, 0, 0), TBI.CM_COAG = c(0, 0, 0, 0, 1, 0), TBI.CM_HYPOTHY = c(0, 0, 0, 0, 0, 0), TBI.CM_LYTES = c(0, 0, 0, 0, 0, 0), TBI.CM_METS = c(0, 0, 0, 0, 0, 0), TBI.CM_NEURO = c(0, 0, 0, 0, 0, 0), TBI.CM_OBESE = c(0, 0, 0, 0, 0, 0), TBI.CM_PARA = c(0, 0, 0, 0, 0, 0), TBI.CM_PSYCH = c(0, 1, 0, 0, 0, 0), TBI.CM_TUMOR = c(0, 0, 0, 0, 0, 0), TBI.CM_WGHTLOSS = c(0, 0, 0, 0, 0, 0), TBI.UTI = c(0, 0, 0, 0, 0, 0), TBI.pneumonia = c(0, 0, 0, 0, 0, 0), TBI.AMI = c(0, 0, 0, 0, 0, 0), TBI.sepsis = c(0, 0, 0, 0, 0, 0), TBI.arrest = c(0, 0, 0, 0, 0, 0), TBI.spineinjury = c(0, 0, 0, 0, 0, 0), TBI.legfracture = c(0, 0, 0, 0, 0, 0), TBI_time_to_surg.NEW = c(0, 0, 0, 0, 0, 0), row.names = c(NA, 6L), class = "data.frame" )
方法1:基础R实现(无需加载第三方包)
通过命名向量建立映射关系,使用索引匹配完成批量替换:
# 1. 编码TBI.iracecat2字段 race_map <- c("Hispanics" = 1, "Blacks" = 2, "Whites" = 3, "other" = 4) TBI_df$TBI.iracecat2_code <- race_map[TBI_df$TBI.iracecat2] # 2. 编码TBI.agecat字段 age_map <- c("Age 18-28" = 1, "Age 29-46" = 2, "Age 47-64" = 3, "Age > 64" =4) TBI_df$TBI.agecat_code <- age_map[TBI_df$TBI.agecat] # 3. 编码TBI.nisscategory字段 niss_map <- c("NISS 0-10" =1, "NISS 11-20"=2, "NISS 21-30"=3, "NISS 31-40"=4, "NISS 41-50"=5, "NISS 51-60"=6, "NISS 61-70"=7, "NISS>70"=8) TBI_df$TBI.nisscategory_code <- niss_map[TBI_df$TBI.nisscategory]
方法2:dplyr包实现(管道式写法更易维护)
使用dplyr::case_when函数实现规则匹配,适合复杂编码场景:
library(dplyr) TBI_df <- TBI_df %>% mutate( # 编码种族字段 TBI.iracecat2_code = case_when( TBI.iracecat2 == "Hispanics" ~ 1, TBI.iracecat2 == "Blacks" ~ 2, TBI.iracecat2 == "Whites" ~ 3, TBI.iracecat2 == "other" ~4 ), # 编码年龄字段 TBI.agecat_code = case_when( TBI.agecat == "Age 18-28" ~ 1, TBI.agecat == "Age 29-46" ~ 2, TBI.agecat == "Age 47-64" ~3, TBI.agecat == "Age > 64" ~4 ), # 编码NISS字段 TBI.nisscategory_code = case_when( TBI.nisscategory == "NISS 0-10" ~1, TBI.nisscategory == "NISS 11-20" ~2, TBI.nisscategory == "NISS 21-30" ~3, TBI.nisscategory == "NISS 31-40" ~4, TBI.nisscategory == "NISS 41-50" ~5, TBI.nisscategory == "NISS 51-60" ~6, TBI.nisscategory == "NISS 61-70" ~7, TBI.nisscategory == "NISS>70" ~8 ) )
注意事项
如果你的三个字段为有序分类变量,转换为连续数值后可直接输入glm模型;如果为无序分类变量,更推荐转换为因子类型生成哑变量进入模型,避免引入不合理的数值级差假设。
内容的提问来源于stack exchange,提问作者CodeRCodeP
相关产品推荐
相关产品推荐

