给你一个贴心的reshape应用
本文作者:余术玲
文字编辑:王碧琪
技术总编:李朋冲
爬虫俱乐部将于2020年1月5日至11日在湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~
在《长宽数据转换——reshape命令》这篇推文中,我们为大家详细介绍了reshape命令的用法,文中举的小例子比较简单,为了让大家巩固和进一步掌握这个命令,今天为大家举几个实际应用中的数据。
为方便读者调用,我们把推文中用到的数据分别保存为独立的文件并且上传到爬虫俱乐部云端数据源,读者可自行下载使用。
案例一
案例一的数据集打开后的部分界面如下:
第一个变量Country代表国家,第二个变量Crisis_year是所研究事件在该国发生危机的年份。我们的目的是生成一个虚拟变量,如果该年发生了危机,取值为1。因此需要将Crisis_year变量展开。
案例一使用的数据存储路径为https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/reshape%E6%A0%B7%E4%BE%8B1.dta
我们使用copy命令下载该文件,然后读入Stata中。执行程序:
clear
cap mkdir d:/reshape样例
cd d:/reshape样例
copy https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/reshape%E6%A0%B7%E4%BE%8B1.dta reshape样例1.dta, replace //使用copy命令下载该数据
use reshape样例1.dta,clear
forval i = 1970(1)2018{
gen crisis`i' = 0
} //生成变量crisis1970-crisis2018,每个变量取值全部设置为0
然后需要找出对应国家发生危机的年份,若该国在”i”年份发生过危机,我们便在crisis”i”变量下取1,否则取0。
forval i = 1970(1)2018{
replace crisis`i' = 1 if strpos(Crisis_year, "`i'") //如果年份i出现在变量Crisis_year中,那么变量crisis`i'取值为1
}
br
部分结果如上图,这是宽型数据,我们需要长型数据进行实证分析,接下来reshape命令要大显身手了,从宽型数据变成长型数据的命令为:reshape long stubnames, i(varlist) j(varname) string,本例中进行转换的主变量stubnames是crisis,作为id变量的i是Country,转换成长型数据需要生成一个新变量year。
reshape long crisis, i(Country) j(year)
部分结果如上图,直观地发现Albania在1982-1993年没有出现危机,在1994年出现了危机。
案例二
案例二的数据集打开后的部分界面如下:
案例二的数据集是关于上市公司各年份高管任职情况。我们发现同一个高管对应的具体职务有多个,最多有5个职务,我们先将具体职务分别拆分出来。
使用的数据存储路径为https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/reshape%E6%A0%B7%E4%BE%8B2.dta
执行程序:
clear
copy https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/reshape%E6%A0%B7%E4%BE%8B2.dta reshape样例2.dta, replace
use reshape样例2.dta,clear
sort stkcd year
split 具体职务,p(",") //具体职务按照逗号隔开
forvalue i = 1/5 {
gen 现职任职开始日期`i' = 现职任职开始日期
}
split 现职任职结束日期,p(",")
gen 现职任职结束日期5 = ""
drop 具体职务 现职任职开始日期 现职任职结束日期
br
部分结果如上图,我们想保留stkcd、year、姓名三个变量不变,具体职务、现职任职开始日期、现职任职结束日期是我们关心的具体数据,需要把它转换成长型数据。
reshape long stubnames, i(varlist) j(varname) string,所以stkcd、year、姓名三个变量作为唯一可识别的变量,代表i,具体职务、现职任职开始日期、现职任职结束日期是本例中进行转换的主变量stubnames,转换成长型数据需要生成一个新变量id。
reshape long 具体职务 现职任职开始日期 现职任职结束日期, i(stkcd year 姓名) j(id)
drop if 具体职务 == ""
br
部分结果如下图:
tab id //找出id的最大值,即5
发现一个高管担任多个具体职务时,除第一个职务,其余职务的现职结束日期空缺,将现职任职开始日期、结束日期变量补全:
foreach date in 现职任职开始日期 现职任职结束日期 {
forvalue i = 2/5 {
replace `date' = `date'[_n-1] if id == `i' & `date' == ""
}
} //如果第n(n>=2)个职务的现职任职日期、现职任职结束日期空缺,用上一行的日期填上
整理好的数据如下图:
案例三
案例三所使用的数据是从wind咨询上面下载的关于公司所有权属性的数据,部分原始数据显示如下图:
我们需要保留证券代码、证券简称不变,转换成长型数据的主变量是公司属性交易日期,想要提取公司属性交易日期的年份。
数据存储路径为https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/%E5%85%AC%E5%8F%B8%E6%89%80%E6%9C%89%E6%9D%83%E5%B1%9E%E6%80%A7.xlsx
执行程序:
clear
copy https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/%E5%85%AC%E5%8F%B8%E6%89%80%E6%9C%89%E6%9D%83%E5%B1%9E%E6%80%A7.xlsx 公司所有权属性.xlsx, replace
import excel using "公司所有权属性.xlsx",clear first
drop in -2/-1 //wind咨询上面下载的数据最后一行会显示数据来源,还会有一个空行。我们不需要这两行,所以删除
rename 证券代码 stkcd
replace stkcd=substr(stkcd,1,6)
destring stkcd,replace
reshape long 公司属性交易日期@1231, i(stkcd) j(year) //注意到年份2016、2015、2014等被嵌在公司属性交易日期变量名中间,这个时候需要借助一个特殊的符号——@占位符号,把年份提取出来
rename 公司属性交易日期1231 公司属性
drop if 公司属性==""
上图是处理好的长型数据。
至此,我们已经详细介绍了reshape命令在实际数据中的应用。看完这编推文你学会使用reshape命令了吗?快和我们一起动手获取网络数据来试试它吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。