如何在Stata中重排分类变量顺序且不损坏原始数据
问题原因
你出现这个问题的核心是混淆了Stata中分类变量的原始数值和值标签的对应逻辑,且操作规则完全不符合原数据的映射关系:
- 你最初运行
label define命令时,没有先查清楚原变量每个数值对应的真实分类,直接按自己想要的排序绑定了新标签,相当于强行给原有数值套错了分类说明,自然出现标签和实际数据不匹配的问题。 - 后续的
recode操作直接修改了原始数值,且映射规则完全错误,直接打乱了不同分类的数值对应关系,最终导致频数完全错位。
正确操作方法
如果还没有保存修改后的数据集,直接重新读取原始数据集即可恢复数据,再按以下两种方法调整排序即可,全程不会修改原始底层数据:
方法1:仅调整显示顺序,完全不改动原变量
先查询原变量的数值和标签的对应关系,运行命令:
label list expenditure
你会得到原数据的映射关系(按你第一次输出的tab结果可直接得出对应关系):
- 数值1 → Afs 2500-5000
- 数值2 → Afs 5000-7500
- 数值3 → Afs 7500-10000
- 数值4 → I don't know / refuse to answer
- 数值5 → Less than Afs 2500
- 数值6 → More than Afs 10000
接下来给值标签添加排序前缀,tab时就会自动按前缀顺序显示:
label define expenditure 5 "1. Less than Afs 2500" 1 "2. Afs 2500-5000" 2 "3. Afs 5000-7500" 3 "4. Afs 7500-10000" 6 "5. More than Afs 10000" 4 "6. I don't know / refuse to answer", replace
运行后再执行tab expenditure,就会得到你想要的排序,且原始数值没有任何改动。
方法2:新增排序专用变量,完全保留原变量
如果不想修改原变量的标签,可以新增一个独立的有序分类变量用于后续分析:
* 备份原变量 clonevar expenditure_raw = expenditure * 生成按需求排序的新变量 gen expenditure_order = . replace expenditure_order = 1 if expenditure_raw == 5 replace expenditure_order = 2 if expenditure_raw == 1 replace expenditure_order = 3 if expenditure_raw == 2 replace expenditure_order = 4 if expenditure_raw == 3 replace expenditure_order = 5 if expenditure_raw == 6 replace expenditure_order = 6 if expenditure_raw == 4 * 给新变量绑定标签 label define expenditure_order 1 "Less than Afs 2500" 2 "Afs 2500-5000" 3 "Afs 5000-7500" 4 "Afs 7500-10000" 5 "More than Afs 10000" 6 "I don't know / refuse to answer" label values expenditure_order expenditure_order * 验证频数和原始一致 tab expenditure_order
如果已经保存了修改后的乱码数据,可按原始频数的对应关系反向recode恢复原始数值后,再按上述方法操作即可。
内容的提问来源于stack exchange,提问作者Joanna
相关产品推荐
相关产品推荐

