如何将Stata字符串变量转为数值变量并生成correspondence.dta映射文件
Stata字符串变量转数值+生成映射文件的解决方案
核心问题
你之前的操作丢失标签是因为用gen复制变量时只复制了数值,未保留值标签;同时缺少导出标签生成映射文件的步骤。以下是完整操作流程:
步骤1:生成带值标签的数值变量
先在原数据中生成带对应标签的数值变量,不要立刻删除原字符串变量:
// 假设原数据已打开 encode country, gen(country_num)
此时country_num是数值变量,且自带值标签(比如1对应US,2对应UK等)。
步骤2:生成映射文件correspondence.dta
通过导出值标签并生成映射数据集,有两种方式:
方式一:手动创建(适合类别少的情况)
// 临时清空当前数据,创建映射表 clear input int country str10 country_name 1 "US" 2 "UK" 3 "Canada" end // 调整变量顺序并保存 order country country_name save "correspondence.dta", replace
方式二:自动化导出标签(适合类别多的情况)
// 先把值标签导出到临时do文件 label save country_num using "temp_labels.do", replace // 读取临时文件生成映射表 clear file open lbl using "temp_labels.do", read file read lbl line local lbl_name "" while r(eof)==0 { // 提取值标签名称 if substr(line, 1, 12) == "label define" { local lbl_name = substr(line, 14, strpos(line, " ") - 14) } // 提取数值和对应字符串 if regexm(line, `"^\s*(\d+)\s+"([^"]+)"') { local num = regexs(1) local name = regexs(2) set obs `num' replace country = `num' in `num' replace country_name = "`name'" in `num' } file read lbl line } file close lbl // 整理并保存映射文件 order country country_name save "correspondence.dta", replace // 删除临时do文件(可选) erase "temp_labels.do"
步骤3:处理原数据集,完成压缩和变量替换
回到原数据集,替换变量并压缩体积:
use "你的原数据文件名.dta", clear // 重新生成带标签的数值变量(如果之前退出了原数据) encode country, gen(country_num) // 替换原变量 drop country rename country_num country // 压缩数据集,进一步减小体积 compress // 保存压缩后的新数据 save "压缩后的文件名.dta", replace
内容的提问来源于stack exchange,提问作者高敬媛
相关产品推荐
相关产品推荐

