如何将数据集中的指定分类行合并生成新列变量
教育维度分类变量合并重编码实现方案
核心逻辑为建立原18类教育取值与目标5类层级的固定映射规则,通过向量化赋值直接生成新变量列,无需逐行遍历处理。
前置准备
先调取原教育变量的全部取值列表,确认18个分类的具体文本、编码内容,提前整理好对应映射关系,避免因字符串不一致导致匹配失效:
参考映射框架:
- 原“无资质证明”类取值 → 新分类“无资质”
- 原小学阶段所属的2类取值 → 新分类“小学学历”
- 原第3、4、5类(初中、高中、中专等)取值 → 新分类“中学学历”
- 原专科、本科阶段所属的7类取值 → 新分类“本科学历”
- 原研究生阶段所属的6类取值 → 新分类“研究生学历”
常用工具实操方法
Python(pandas 实现)
通过字典映射完成批量匹配,代码简洁且无循环性能损耗:
import pandas as pd # 逐行补全原取值到新分类的对应关系 edu_map = { "无资质证明": "无资质", "小学肄业": "小学学历", "小学毕业": "小学学历", "初中结业": "中学学历", "高中毕业": "中学学历", "中专毕业": "中学学历", # 剩余本科、研究生类的映射按实际取值补全 } # 生成新的5分类教育变量 df["edu_5cat"] = df["原教育维度变量"].map(edu_map) # 校验未匹配成功的原取值 unmatched_vals = df[df["edu_5cat"].isna()]["原教育维度变量"].unique()
R语言(dplyr 实现)
通过条件判断批量赋值,适配数据框管道操作流程:
library(dplyr) df <- df %>% mutate( edu_5cat = case_when( 原教育维度变量 == "无资质证明" ~ "无资质", 原教育维度变量 %in% c("小学肄业", "小学毕业") ~ "小学学历", 原教育维度变量 %in% c("初中结业", "高中毕业", "中专毕业") ~ "中学学历", 原教育维度变量 %in% c("大专毕业", "本科毕业") ~ "本科学历", 原教育维度变量 %in% c("硕士毕业", "博士毕业") ~ "研究生学历", .default = NA_character_ ) ) # 校验未匹配的原取值 unmatched_vals <- df %>% filter(is.na(edu_5cat)) %>% distinct(原教育维度变量)
Stata 实现
适配社科研究常用的面板数据处理流程:
* 初始化新变量为空值 gen edu_5cat = "" * 逐类完成匹配赋值 replace edu_5cat = "无资质" if 原教育维度变量 == "无资质证明" replace edu_5cat = "小学学历" if 原教育维度变量 == "小学肄业" | 原教育维度变量 == "小学毕业" replace edu_5cat = "中学学历" if inlist(原教育维度变量, "初中结业", "高中毕业", "中专毕业") replace edu_5cat = "本科学历" if inlist(原教育维度变量, "大专毕业", "本科毕业") replace edu_5cat = "研究生学历" if inlist(原教育维度变量, "硕士毕业", "博士毕业") * 转换为带值标签的分类变量,避免排序错乱 encode edu_5cat, gen(edu_5cat_code) * 校验未匹配样本 tab 原教育维度变量 if edu_5cat == ""
操作注意事项
- 不要直接覆盖原有的18类教育变量,保留原字段便于后续回溯和校验。
- 匹配前先通过
unique(原教育维度变量)调取所有实际取值,确认字符串的空格、标点、大小写完全和映射规则一致,避免隐性匹配失效。 - 赋值完成后跑交叉表
table(原教育维度变量, edu_5cat),逐类核对原分类和新分类的对应关系,确保没有错配、漏配的情况。
内容的提问来源于stack exchange,提问作者Kuddiking
相关产品推荐
相关产品推荐

