朝花夕拾|长宽数据转换——reshape命令
本文作者:余术玲
文字编辑:王碧琪
技术总编:李朋冲
重磅!!!为了大家能够更好地学习Python技术,以及应广大粉丝和往期学员的要求,2019年11月29日-12月1日,武汉字符串数据科技有限公司将在湖北武汉举办《第四期Python编程技术培训》。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python的编程技术,特别是网络数据抓取技术。目前正在火热招生中~
如果有兴趣,具体培训内容详见《2019年Python第四期培训招生》,报名请点击:阅读原文哦~
一般来说,我们用面板数据做实证的话,常用的是类似下图左边的长型数据。将下图左边长型数据类比于上市公司财务数据,则i相当于股票代码,j相当于年份,stub是不同的会计条目数据,每一行数据都是一个独特的firm-year observation(当然,整个数据要经过剔重的)。
但是有时候我们得到的数据类似于下图右边的宽型数据,每一个公司只有一个观测值,后面的stub1、stub2对应的是不同年份的取值,这时我们就需要借助reshape命令进行长宽型数据转换。
一.reshape命令语法
从宽型数据变成长型数据的命令为:
reshape long stubnames, i(varlist) j(varname) string
从长型数据变成宽型数据的命令为:
reshape wide stubnames, i(varlist) j(varname) string
(1)stubnames是要进行转换的主变量;
(2)i(varlist)是要作为id的变量,需要注意的一点是这个变量必须是唯一可识别的,不可以有重复值,否则会出错;
(3)j(varname),在长型数据变宽型数据时,是在长型数据中存在但是在宽型数据中就不存在的变量;在宽型数据变长型数据时,varname表示在宽型数据中不存在而在长型数据中新生成的。
(4)string声明j(varname)中的varname是字符型。
大家看完是不是一头雾水?不要着急,这个命令就像绝世武功,修行不易,但掌握好精妙之后,威力无穷!关于reshape命令怎么用,我们用几个小例子来说明一下。
二.reshape命令的例子
1. 最基本的长型和宽型数据转换
首先我们输入原始为宽型格式的数据集:
clear
input state inp63 inc63 inp64 inc64 inp65 inc65
1 4.5 4.5 4.6 4.6 4.5 4.6
2 4.4 4.8 4.3 4.8 4.3 4.8
3 4.5 4.6 4.5 4.6 4.5 4.6
end
list
这个数据是宽型数据,变量上出现的63、64、65是年份,inp和inc是我们关心的具体数据,需要把它转换成长型数据:
reshape long inp inc, i(state) j(year)
list, sepby(state)
在以上变换中,i代表state,stub代表inp和inc,而j则代表year,是要在长型数据中新生成的变量。
reshape wide //重新变回原来的宽型数据
list
在使用过reshape long命令后,再转换为宽型数据,可以用reshape wide命令自动地进行这种转换。
2. 宽型数据,当i(varlist)中的varlist的值不唯一时
clear
input state inp63m inc63 inp64m inc64 inp65m inc65
1 4.5 4.5 4.6 4.6 4.5 4.6
2 4.4 4.8 4.3 4.8 4.3 4.8
3 4.5 4.6 4.5 4.6 4.5 4.6
end
list
注意到,当state取值为2时,对应地有两行观测值。我们用reshape long 对上面的宽型数据进行变换:
reshape long inp inc, i(state) j(year)
结果程序报错了,程序提醒说,因为id变量中的数值有重复值,因此不能唯一识别。通过reshape error可以看出哪些值重复了。
把重复值剔除或进行相应的处理后,可以重新进行长型变换。
3. j(varname)中的varname被嵌在变量中间
输入数据:
clear
input state inp63m inc63 inp64m inc64 inp65m inc65
1 4.5 4.5 4.6 4.6 4.5 4.6
2 4.4 4.8 4.3 4.8 4.3 4.8
3 4.5 4.6 4.5 4.6 4.5 4.6
end
list
注意到年份63、64、65被嵌在inp变量名中间,这个时候需要借助一个特殊的符号——@占位符号
reshape long inp@m inc, i(state) j(year)
list, sepby(state)
这样,我们就在转换过程中,顺利地生成了年份变量。
4. j(varname)中的varname是字符型变量
输入数据:
clear
input state incs incn
1 4.5 4.5
2 4.4 4.8
3 4.5 4.6
end
list
这个数据中,state表示州,incs表示州的南方收入,incn表示州的北方收入,用变量location表示南北方,但是这个变量是字符型变量,这个时候就需要用到string选项。在这里,i表示state,stub代表inc,而j就代表了州的南方或者北方,即方位变量location,我们需要在长型数据中生成这个变量:
reshape long inc, i(state) j(location) string
list, sepby(state)
5. i(varlist)中包含多个变量
前面的转换都是把两个变量合成一个变量或者把一个变量拆分成两个变量,当要把三个变量合成一个变量时就有点复杂,举个例子,输入下面的数据:
clear
input state str4 location year inc
1 s 63 4.5
1 s 64 4.8
1 n 63 4.6
1 n 64 4.9
end
list
首先我们要识别出这个数据是长型格式,我们要把它变成宽型数据。要把上面数据中的location、year、inc合成一个变量,我们可以分两步走:
第一步,state和year变量保持不变,把location和inc合并成一个变量
reshape wide @inc, i(state year) j(location) string
list
第二步,state变量保持不变,把year和ninc、sinc变量合并成一个变量:
reshape wide ninc sinc,i(state) j(year)
list
同理,如果我们想把宽型数据变成长型,也要分两步走:
reshape long ninc sinc, i(state) j(year)
reshape long @inc, i(state year) j(location) string
list
通过上面的一些例子,大家对reshape有没有一些了解了呢?以上是一些示例的数据,相对来讲比较简单,在后续的推文中,我们会有几个实际应用中的数据来帮助大家更好地理解并运用reshape。如果你需要长宽数据的变形,不妨试试这个命令吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。