如何用R高效重编码自由响应字段与组织字段为分类变量?
优雅实现R中多值分类映射的方法
问题场景
现有数据集结构如下:
record_id | organization | other_work_loc
1 12 CCC
2 12 AMG
3 12 TAO
4 1
5 2
6 7
其中other_work_loc仅在organization=12时有值,需将organization与other_work_loc合并为org_cat列,规则为:
organization为1或2 →org_cat='1'organization在3-11之间 →org_cat='2'- 多数
other_work_loc值归为org_cat='3',但有22个特定值需分别映射到'1'或'2'
以下是替代逐个罗列值的优雅实现方案:
方案1:分类向量结合%in%判断
将需要映射到'1'和'2'的other_work_loc值分别存入向量,在case_when中用%in%批量判断,便于维护:
# 定义需映射到'1'的other_work_loc取值(补充剩余对应值) map_to_1 <- c("CCC", "VAL1", "VAL2", "...") # 定义需映射到'2'的other_work_loc取值(补充剩余对应值) map_to_2 <- c("AMG", "VAL3", "VAL4", "...") dataset <- dataset %>% mutate(org_cat = case_when( organization %in% c(1, 2) | other_work_loc %in% map_to_1 ~ '1', between(organization, 3, 11) | other_work_loc %in% map_to_2 ~ '2', organization == 12 ~ '3' # 未在映射列表的other_work_loc统一归为3 ))
方案2:命名向量实现直观映射
用命名向量直接定义other_work_loc与org_cat的对应关系,逻辑更清晰:
# 创建命名向量:键为other_work_loc值,值为对应的org_cat owl_map <- c( "CCC" = "1", "VAL1" = "1", # 归为1的取值 "AMG" = "2", "VAL3" = "2" # 归为2的取值 ) dataset <- dataset %>% mutate( # 从命名向量中匹配other_work_loc对应的分类 owl_cat = ow_map[other_work_loc], # 按优先级生成最终org_cat:organization规则优先,其次是映射值,最后默认3 org_cat = case_when( organization %in% c(1, 2) ~ '1', between(organization, 3, 11) ~ '2', !is.na(owl_cat) ~ owl_cat, TRUE ~ '3' ), # 移除临时辅助列 owl_cat = NULL )
补充说明
between(organization, 3, 11)等价于原代码的organization >=3 & organization <=11,写法更简洁- 两种方案都支持快速新增/修改映射值,无需修改
case_when的判断逻辑,维护成本更低 - 因
other_work_loc仅在organization=12时有值,最终的TRUE ~ '3'只会匹配到该场景下未在映射列表的取值
内容的提问来源于stack exchange,提问作者Phoebe Long
相关产品推荐
相关产品推荐

