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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:08