问题
使用CGSS2010重复某文章中的定量研究,中需要因变量“区县人均收入”。
如何在CGSS2010中为所有样本生成一个格式一的“所在区县”信息?
CGSS2010中包含区县信息的变量为S42。tab s42 发现,其中填写方式混乱, 在是否包含市级信息,是否包含“市”、“区”、县”等字样、是否包含空格等方面 存在大量不一致,无法采用统一的标记及顺序行提取。
目标
尽量避免缺失值地生成区县变量,内容为不包含地区行政级别的区县名称,一 般是2个字,也可能是1或3个字。
分析过程
使用tab查看当前填写方式形成的所有分类;
规律
1、按照标记可以分为四种类型:①含“市”且含“区/县”,②含“市”不含“区/县”,
③不含“市”但含“区/县”,④不含“市”不含“区/县”四种情况;
2、存在同时包含两个“市”字符的数据,统一认定为县级市,计划保留后一个 市的信息;
3、需要清除的符号有空格和加号“十”;
计划
基本思路
1.清除多余的空格及加号
replace
subinstr()
2.去掉市级信息,只保留县级信息
generate
replace
strpos()
usubstr()
length()
(1)带标记的:从“市”所在的顺位开始提取到最后一个字符
(2)不带标记的:观察构成,寻找其他规律,比如相同字数的值是否可以取倒数几位
3.去除末尾的“市”、“区”、“县”、“左旗”、“县级市” 等字样
4. 2~3之前可以将各记号所在顺位、字符串长度生成为工具变量,方便书写的减省
代码
use "D:\Privacy of Wal\graduate crriculum\stata\about CGSS\CGSS2010-15.dta"
*从s42中提取出区县名(不含区县二字)并存放到新变量
tab s42 //分类统计查看取值及其分布
*统一格式和生成工具值
replace s42=subinstr(s42," ","",.) //去除S42取值中的空格
replace s42=subinstr(s42," ","",.) //去除S42取值中的空格
gen shipos=(strpos(s42,"市")+2)/3 if strpos(s42,"市")!=0 //找到第一个“市”的位置
gen quxianpos=(strpos(s42,"县")+2)/3 if strpos(s42,"县")!=0
replace quxianpos=(strpos(s42,"区")+2)/3 if strpos(s42,"区")!=0 //找到“区”或“县”的位置
gen chang=length(s42)/3 //计算字符串总长度
*去掉市级信息
***先处理所有中间不含“市”字样的字符串(每次执行后使用tab检查当前各类计数)
gen quxian=s42 if shipos==. & quxianpos!=. //获取不含“市”字样的字符串
replace quxian=usubstr(quxian,-3,.) if length(quxian)/3==5 | length(quxian)/3==6 | length(quxian)/3==7 //5、6、7字符的为不含“市”字样但有市级信息
***处理所有中间含“市”字样的字符串
replace quxian= usubstr(s42,shipos+1,chang-shipos+1) if length(quxian)==0
***处理余下2129个字符串(tab s42 length(quxian)==0)
******2个字符的(. tab s42 if length(quxian)==0 & length(s42)/3==2)
replace quxian=s42 if length(quxian)==0 & chang==2
******3个字符的(. tab s42 if length(quxian)==0 & length(s42)/3==3)
replace quxian=usubstr(s42,-3,2) if length(quxian)==0 & chang==3 //该类内容均为“XX市”,当作县级市处理
******4个字符的(. tab s42 if length(quxian)==0 & length(s42)/3==4)
replace quxian=s42 if s42=="哈尔滨市" | s42=="连云港市" //少数特殊情况
replace quxian=usubstr(s42,-2,2) if length(quxian)==0 & chang==4
******5个及以上字符的(. tab s42 if length(quxian)==0 & length(s42)/3>=5)//没有规律
replace quxian="道外" if strpos(s42,"道外")!=0
replace quxian="土默特" if strpos(s42,"土默特")!=0
replace quxian="奉化" if strpos(s42,"奉化")!=0
replace quxian="丰城" if strpos(s42,"丰城")!=0
replace quxian="洪江" if strpos(s42,"洪江")!=0
replace quxian="莱州" if strpos(s42,"莱州")!=0
replace quxian="老河口" if strpos(s42,"老河口")!=0
replace quxian="宜君" if strpos(s42,"宜君")!=0
replace quxian="克山" if strpos(s42,"克山")!=0
*取消末尾的“市”、“区”、“县”、“左旗”、“县级市” ,修改其他不规律值
replace quxian=subinstr(quxian,"县级市","",.) if strpos(quxian,"县级市")!=0
replace quxian=subinstr(quxian,"市","",.) if strpos(quxian,"市")!=0
replace quxian=subinstr(quxian,"区","",.) if strpos(quxian,"区")!=0
replace quxian=subinstr(quxian,"县","",.) if strpos(quxian,"县")!=0
replace quxian=subinstr(quxian,"左旗","",.) if strpos(quxian,"旗")!=0 //去掉区县旗等多余字样
replace quxian="浦东" if strpos(s42,"浦东")!=0
replace quxian="歙" if strpos(s42,"歙")!=0 //最后两种不规律字符串
注意事项
-
stata中每一个汉字占3位
- 例. length(“呼和浩特”)==12 length(),strpos()得到的结果是目标字符在字符串中处于第几位。
- 例. strpos(“北京市东城区”,“市”)==7 使用usubstr()从后向前取字符
- 取最后3位 usubstr(“ABCDEF”,-3,.)==“DEF”
- 从倒数x位向后取y位 usubstr(“ABCDEF”,-4,2)==“CDE”
本文介绍了如何在Stata中处理CGSS2010数据集中格式混乱的地区变量S42,以提取不包含行政级别的区县名称。通过分析变量的四种类型,清理多余符号,去除市级信息,并移除特定字样,最终生成目标区县变量。
5万+

被折叠的 条评论
为什么被折叠?



