查看原文
其他

统计年鉴数据整理小技巧

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王   悦,中南财经政法大学金融学院

本文编辑:赵冰洁

技术总编:余术玲

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!  
统计年鉴中的数据是我们做研究经常用到的,近日小编在中国知网 —— “中国经济社会大数据研究平台”下载了一些数据,然而下载到的数据并不是我们做研究需要的数据格式,于是小编写了一小段程序进行处理,命令虽然简单,但是比较实用,希望对大家有所帮助。
假设我们下载了 2010-2019 年所有省份(包括自治区、直辖市)的 “GDP”、“人均GDP” 以及 “人口数”,得到 “sample.xls” 这个文件(可通过后台回复 sample 获取),并读入Stata,程序如下:
clear
import excel using sample.xls,clear
读入后内存中数据如下图所示:

然而,我们想要的数据格式,事实上是一个面板数据,理想的形式如下图所示:

怎么实现上述的转换呢?对于这个数据,笔者有两个非常直观的想法:
(1)分年度处理
我们分别保留每一年的数据,如 2019 年(对应变量A-D):
clear
import excel using sample.xls,clear
keep A-D

接着做一下简单的清洗,并生成年份:
drop in 1/2
rename * (prov GDP pGDP POP)
destring _all, replace ignore("--")
gen year = 2019
order prov year
save 2019, replace

同理,我们可以得到 2018、2017… 等其他年份的数据,最后纵向合并即可。但这种方法十分繁琐:第一,保留变量时,并不能自动化,需要我们人工的判定保留哪几个变量;第二,生成的年份也是在变化的。如果想要使用循环,由于并不是每次单独对一个变量进行处理,所以直接使用:
foreach var of varlist _all {
    ...
}
这一结构并不适用。为了构造循环,我们可以对变量进行重命名:
import excel using sample.xls, clear
rename * v#, addnum   //内存中所有的变量A-AE变为v1-v31

变量重命名以后,我们就可以按照每 3 个变量为一组进行循环,如 v2-v4、v5-v7…(其中,v1是每一组中都需要保留的),并且我们可以定义初始年度 local j = 2019,随着循环依次生成年份,完整程序如下:
clear
import excel using sample.xls, clear
drop in 1/2
ren * v#, addnum
des   //得到总变量数(可通过return list查看返回值r(k)),以便在循环中调用
local j = 2019
forv i = 2(3)`r(k)' {
    preserve
    keep v1 v`i'-v`=`i'+2'    //保留当年变量,每3个为一组
    rename * (prov GDP pGDP POP)
    gen year = `j'    //生成对应年份
    save `j', replace
    local j = `j' - 1
    restore
}*合并dta文件
clear
fs *.dta
foreach c in `r(files)' {
    append using `c'
}
destring _all, replace ignore("--")
order prov year
sort prov year
save sample, replace
程序运行结果如下图所示:

至此,利用第一种方法达到了我们的目的。但是这个方法,需要生成多个 dta 文件,整个处理过程相对繁琐。
(2)reshape 命令
事实上,遇到这种数据,我们很容易联想到使用 reshape 命令进行“宽to长”的转换,但是内存中的变量的名称并不允许我们这么做,如果我们可以将变量名变为如下形式:

就可以通过程序:reshape long GDP pGDP POP, i(prov) j(year) 达到我们的目的。问题是如何实现上述的重命名呢?笔者采用的是如下一个简单的循环:
clear
import excel using sample.xls,clear
des
ren * v#, addnum
local j = 1
forv i = 2(3)`r(k)' {
    ren v`i' GDP`=2020-`j''
    ren v`=`i'+1' pGDP`=2020-`j''
    ren v`=`i'+2' POP`=2020-`j''
    local j=`j'+1
}
drop in 1/2
ren v1 prov
上述程序中,从 v2 开始循环,每三个变量为一组,第一次循环分别实现了 v2、v3、v4 的重命名,对应变量名 GDP2019、pGDP2019、POP2019;第二次循环实现了 v5、v6、v7 的重命名,对应变量名 GDP2018、pGDP2018、POP2018…… 最后使用 reshape 命令进行“宽to长”的转换即可:
reshape long GDP pGDP POP, i(prov) j(year)
destring _all, replace ignore("--")
save sample, replace
如果大家下载的不是3个变量,只需要对程序进行微调即可实现类似数据的整理。当然,方法绝不仅仅只有两种,如果大家有更好的处理方法,欢迎进行交流!




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

Seminar | 作为飞行员,我比别的CEO多了什么?

利用TensorFlow构建前馈神经网络

推文合集(1)| Stata学习者必看的n篇推文!

Seminar | 诚信的价值

利用tushare获取股票数据及实现可视化

从Excel到Stata的“摆渡车”——import excel命令

光阴十载,见证了《经济研究》中的“高被引”

利用tushare获取股票数据

         在Python中实现Stata的stack功能

这些年,经管类C刊都在研究什么?

Seminar | 眼见为实吗?高管面部可信度、审计师任期与审计费用

Seminar | 恐怖袭击与CEO薪酬

代码补全,主题更换,Jupyter Notebook原来可以这样用?

【爬虫实战】“双十一”微博热搜实时跟进

Stata中的数值型变量分类神器--recode

fs命令——我们的小帮手

【邀请函】听说你还在为处理表格头大?

用stack取代excel的数据重整操作吧

  日期数据处理

         Seminar | 委托贷款:打开中国影子银行的黑匣子

         Seminar | 电话会议中的"non-answer"  

关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存