【stata笔记】从规律混乱的字符串中提取某个类别的字符(以CGSS2010的地区变量为例) 您所在的位置:网站首页 提取一串数字里的某一个数字 【stata笔记】从规律混乱的字符串中提取某个类别的字符(以CGSS2010的地区变量为例)

【stata笔记】从规律混乱的字符串中提取某个类别的字符(以CGSS2010的地区变量为例)

2023-12-26 14:52| 来源: 网络整理| 查看: 265

问题

使用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”


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有