R 自动化重编码数值型分类变量为有意义因子变量的实现方法
R语言宽映射表转换与批量变量重编码方案
宽格式映射表转长格式
直接使用tidyverse套件的pivot_longer函数完成结构转换,处理后输出每行对应单个变量的单条数值-标签映射规则的长表:
# 加载依赖包 library(tidyverse) # 原始宽映射表 mapping <- data.frame("Variable" = c("Var1", "Var2", "Var3", "Var4"), "Value1" = c(2,2,2,7), "Word1" = c("yes","yes","yes","condition A"), "Value2" = c(1,1,1,6), "Word2" = c("no","no","no","Condition B"), "Value3" = c(8,8,8,5), "Word3" = c("unk","unk","unk", "Condition C"), "Value4" = c(NA,NA,NA,4), "Word4" = c(NA,NA,NA,"Condition B") ) # 宽转长核心逻辑 mapping_long <- mapping %>% group_by(Variable) %>% pivot_longer( cols = -Variable, names_to = c(".value", "seq"), names_pattern = "(Value|Word)(\\d+)" ) %>% drop_na(Value, Word) %>% ungroup() %>% select(-seq)
转换后的mapping_long结构示例:
| Variable | Value | Word |
|---|---|---|
| Var1 | 2 | yes |
| Var1 | 1 | no |
| Var1 | 8 | unk |
| Var2 | 2 | yes |
| ... | ... | ... |
批量重编码原始数据
拿到长格式映射表后,可直接批量完成所有分类变量的因子转换:
# 示例原始数据 data <- data.frame("ID" = c(1:5), "Var1" = c(2,2,8,1,8), "Var2" = c(5,8,4,88,10)) # 批量重编码核心逻辑 data_recoded <- data %>% mutate(across( # 仅处理映射表中存在的变量 any_of(unique(mapping_long$Variable)), ~ factor( x = ., # 取当前变量对应的数值作为因子水平 levels = mapping_long$Value[mapping_long$Variable == cur_column()], # 取当前变量对应的标签作为因子显示值 labels = mapping_long$Word[mapping_long$Variable == cur_column()] ) ))
如果需要处理映射表中未覆盖的数值(比如示例中Var2的5、88等),可提前在映射表中对应变量下补充Value=其他值, Word=unknown的规则,或在转换后用forcats::fct_explicit_na将未匹配的值统一设置为指定标签。
内容的提问来源于stack exchange,提问作者Klaus Peter
相关产品推荐
相关产品推荐

