资料来源 :连玉君Stata 初级 研讨班讲义
以文字类型存储的数字之转换 -destring-
//说明:
//*- 从 .txt 文档中读入数值变量之所以会以文字值方式存储,
// *- 主要原因是变量中可能包含了如下特殊符号:
// *- 金额 `$' 、逗号 `,' 、斜线 `/' 、百分比 `%' 、破折号 `-'
shellout "d202.txt"
des
sum
//*- 说明:虽然 code 变量由数字组成,但其类型为 str7, 即为文字型变量
// * leverage, size, date 都存在类似的问题
// *- 原理
use "d202.dta", clear
destring code, gen(code1) ignore(" ")
destring leverage, gen(lev) percent
//*- 整体处理方案
use "d202.dta", clear
destring code year date size lev, replace ignore(" -/,%") // 五个字符
纯文字类别变量之转换 -encode-, -rdecode-
use "d202.dta", clear
encode gov, gen(gov1)
labelbook
// *- 缺陷:
//* (1) 没有 -replace- 选项 [-rdecode-]
// * (2) 每次只能转换一个变量,无法实现批量转换 [-rdecodeall-]
// *-rdecode- 命令:附加 replace 选项 (self-reading)
use "d202.dta", clear
rencode gov, replace
label list gov // 另一种方式
// *- 说明:
//* (1) 与该命令功能相似的还有 -sencode- 命令
// * (2) 使用 -rdecodeall- 命令可以同时转换多个变量
//*-encode 命令与 -destring- 的区别
// *-(1) 若数字 “ 误存 ” 为文字型变量,使用 -destring- 命令或 real() 函数
// *-(2) 若观察值均为 “ 文字值 ” ,则需使用 -encode- 或 -rencode- 命令,
// * 这些命令会自动产生【数字 - 文字对应表】
*-2.7.2 将数字转换成文字
//*- 某些情况下,先把数字转换成文字,
// *- 然后利用处理文字的函数进行处理比较方便
//*- 范例 1 :年月日的组合
use "tostring.dta", clear
gen date = year + "-" + month + "-" + day
gen edate = date(date, "YMD")
format edate %td
browse
//*- 范例 2 :年月日的分离
use "tostring2.dta", clear
browse
tostring date_pub, gen(date1)
gen year = substr(date1, 1, 4)
gen month = substr(date1, 5, 2)
gen day = substr(date1, 7, 2)
browse
destring year month day, replace
browse
// *- 说明:
//* -decode- 命令的缺陷同样在于没有 -replace- 选项,
//* 可以采用外部命令 -rdecode- 或 -sdecode- 代替之。-
文字样本值的分解
use "d202.dta",clear
list
//*- 从 year 变量中提取年份 -split-
split year, parse(-)
order year year1 year2
list
browse
gen year3 = real(year1) // year1 中全为数值,但以文字型存储
// * destring year1, replace // 另一种方式
// *- 从 date 变量中提取年份、月度和日期 , 并转化为数值
split date,parse(/) destring ignore("/")
order date date*
br
处理文字的函数 (self-reading)
help string functions
help egen
help egenmore // 外部命令 , 提供了很多有用的文字和日期处理函数
// 文字函数简介
dis lower("AbCDef")
dis length("price weight length mpg")
dis wordcount("price weight length mpg") // 统计变量的个数
dis proper("mR. joHn a. sMitH") // 规整人名
dis strmatch("C51", "C")
dis strmatch("C51", "C*") // 寻找制造业公司
dis trim(" I love STATA ") // 去掉两端的空格
dis ltrim(" I love STATA ") // 去掉左边的空格
dis rtrim(" I love STATA ") // 去掉右边的空格
dis itrim(" I love STATA ") // 去掉中间的空格
dis itrim(" 内 蒙 古 自治区 ") // 去掉中间的空格,不奏效?
dis subinstr(" 内 蒙 古 自治区 ", " ", "", .)
//*- 释义:
// * subinstr(s, s1,s2, n)
//* s1 “ 将被替换 ” 的字符串
// * s2 “ 替换成 ” 的字符串
// * n 前 n 个出现的目标字符,若为 “.” 则表示全部替换
dis subinstr(" 内 蒙 古 自治区 ", " ", "", 1)
dis subinstr(" 内 蒙 古 自治区 ", " ", "", 3)
//*- 说明:上述函数都可以用于 -generate- 命令来生成新的变量
//例 -1- :上市公司日期、行业代码和所在地的处理
//*-a 待处理的数据
shellout "d203.txt"
insheet date sic location using "d203.txt", clear
save "d203.dta", replace
browse
// *-b 从 date 中分离出年、月、日
gen year = int(date/10000)
tostring date, gen(date1)
gen year1 = substr(date1,1,4)
gen year2 = real(year1)
gen month = substr(date1,5,2)
gen month1= real(month)
gen day = substr(date1,7,2)
gen day1 = real(day)
browse
//*- 更为简洁的命令
use "d203.dta", clear
gen sdate = string(date,"%10.0g") // help string()
gen year = real(substr(string(date,"%10.0g"), 1, 4))
gen month = real(substr(sdate, 5, 2))
gen day = real(substr(sdate, 7, 2))
browse
drop sdate
//从行业大类 sic 中分离出行业门类
gen sic_men0 = substr(sic,1,1)
encode sic_men0, gen(sic_men)
tab sic_men
label list sic_men
// 从地点中分离出省份和城市
use "d203.dta",clear
list
gen province1 = substr(location, 1,2)
gen city1 = substr(location, 4,4)
list location province1 city1
gen province2 = word(location, 1)
gen city2 = word(location, 2)
list location province1 city1 province2 city2
//*- 注意:每个英文字母占一位,但每个中文字符占两位
//例 -2- :银企关系数据中银行名称的提取
// *- 数据描述
use "bankname.dta", clear
fre objnm
list in 1/15
//*- 任务:提取出关联银行总部的名称
keep in 1/15
gen bank = objnm
replace bank=" 中国农业银行 " if strmatch(bank,"* 农业银行 *")
replace bank=" 招商银行 " if strmatch(bank,"* 招商 *")
replace bank=" 中国银行 " if strmatch(bank,"* 中国银行 *")
replace bank=" 中国工商银行 " if strmatch(bank,"* 工商 *")
replace bank=" 兴业银行 " if strmatch(bank,"* 兴业 *")
replace bank=" 光大银行 " if strmatch(bank,"* 光大 *")
replace bank=" 交通银行 " if strmatch(bank,"* 交通 *")
replace bank=" 北京银行 " if strmatch(bank,"* 北京 *")
compress
browse
文本分析的一些命令
help screening // 文字变量的清理 , Stata Journal 10-3
shellout "$R\screening.pdf" // 详细说明和范例
help txttool // 文字变量的清理 , Stata Journal 14-4
shellout "$R\txttool.pdf"
help tex_equal // 多个文本的对比
help fren // 修改文件名称
help fdta // 替换文字变量的内容
help tex2col // 文本表格转化为变量 , 适合提取网页或 PDF 文件中的表格