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
相关产品推荐
相关产品推荐

