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

R语言患者主病症数字列高效重分类编码优化求助

病症数字编码优化方案

问题背景

我有一列对应患者主病症的数字数据,需将其重编码为慢性疼痛、神经类、精神类、其他等病症类型。当前使用的嵌套ifelse代码冗余且无法正常运行,原代码如下:

October_data_UK$Primary_cat <- ifelse(October_data_UK$PRIMARY==2|October_data_UK$PRIMARY==5|October_data_UK$PRIMARY==7|October_data_UK$PRIMARY==10|October_data_UK$PRIMARY==13|October_data_UK$PRIMARY==14|October_data_UK$PRIMARY==16|October_data_UK$PRIMARY==23|October_data_UK$PRIMARY==24|October_data_UK$PRIMARY==27,"Chronic_pain", ifelse(October_data_UK$PRIMARY==4|October_data_UK$PRIMARY==9|October_data_UK$PRIMARY==15|October_data_UK$PRIMARY==21|October_data_UK$PRIMARY==22|October_data_UK$PRIMARY==31|October_data_UK$PRIMARY==35|October_data_UK$PRIMARY==37|October_data_UK$PRIMARY==38, "Neurological", ifelse(October_data_UK$PRIMARY==1|October_data_UK$PRIMARY==3|October_data_UK$PRIMARY==6|October_data_UK$PRIMARY==12|October_data_UK$PRIMARY==17|October_data_UK$PRIMARY==18|October_data_UK$PRIMARY==20|October_data_UK$PRIMARY==25|October_data_UK$PRIMARY==26,October_data_UK$PRIMARY==30|October_data_UK$PRIMARY==32|October_data_UK$PRIMARY==34|October_data_UK$PRIMARY==36,"Psychiatric", ifelse(October_data_UK$PRIMARY==8|October_data_UK$PRIMARY==11|October_data_UK$PRIMARY==19|October_data_UK$PRIMARY==33|October_data_UK$PRIMARY==28|October_data_UK$PRIMARY==29|October_data_UK$PRIMARY==39,"Other",NA))))

需求:优化代码,无需重复引用October_data_UK$PRIMARY列名,直接批量指定对应数字。

优化方案1:使用dplyr的case_when(推荐)

case_when支持清晰的多条件匹配,无需重复调用列名,代码可读性和维护性都很强:

library(dplyr)

October_data_UK <- October_data_UK %>%
  mutate(Primary_cat = case_when(
    PRIMARY %in% c(2,5,7,10,13,14,16,23,24,27) ~ "Chronic_pain",
    PRIMARY %in% c(4,9,15,21,22,31,35,37,38) ~ "Neurological",
    PRIMARY %in% c(1,3,6,12,17,18,20,25,26,30,32,34,36) ~ "Psychiatric",
    PRIMARY %in% c(8,11,19,33,28,29,39) ~ "Other",
    TRUE ~ NA_character_ # 未匹配的数字返回NA
  ))

注:原代码中精神类的判断存在语法错误,额外的October_data_UK$PRIMARY==30|...未整合到条件中,这里已将所有对应精神类的数字合并到一个向量内。

优化方案2:使用Base R实现(无需额外包)

如果不想加载外部包,可以通过命名向量建立映射关系,完成批量编码:

# 建立数字到类别映射的命名向量
primary_mapping <- c(
  "Chronic_pain" = 2, "Chronic_pain" =5, "Chronic_pain"=7, "Chronic_pain"=10,
  "Chronic_pain"=13, "Chronic_pain"=14, "Chronic_pain"=16, "Chronic_pain"=23,
  "Chronic_pain"=24, "Chronic_pain"=27,
  "Neurological"=4, "Neurological"=9, "Neurological"=15, "Neurological"=21,
  "Neurological"=22, "Neurological"=31, "Neurological"=35, "Neurological"=37,
  "Neurological"=38,
  "Psychiatric"=1, "Psychiatric"=3, "Psychiatric"=6, "Psychiatric"=12,
  "Psychiatric"=17, "Psychiatric"=18, "Psychiatric"=20, "Psychiatric"=25,
  "Psychiatric"=26, "Psychiatric"=30, "Psychiatric"=32, "Psychiatric"=34,
  "Psychiatric"=36,
  "Other"=8, "Other"=11, "Other"=19, "Other"=33, "Other"=28, "Other"=29,
  "Other"=39
)

# 反转映射,让数字作为键,类别作为值
primary_mapping_rev <- setNames(names(primary_mapping), primary_mapping)

# 批量赋值,未匹配的数字自动返回NA
October_data_UK$Primary_cat <- primary_mapping_rev[as.character(October_data_UK$PRIMARY)]

内容的提问来源于stack exchange,提问作者NoobR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:55:22