更新时间:2021-12-05 13:37:50
本节书摘来自华章出版社《Stata统计分析与应用(第2版)》一书中的第2章,第2.3节,作者 周广肃,更多章节内容可以访问云栖社区“华章计算机”公众号查看
本节将介绍数据整理的相关内容,主要包括数据的标签与排序、数据拆分、数据合并和数据的长宽转换等内容。
为数据库添加标签的基本命令为:
label data ["label"]
["label"]即代表所要添加的标签内容。
为变量添加标签的基本命令为:
label variable varname ["label"]
varname代表所要添加标签的变量名称,["label"]代表所要添加的标签内容。
对于数值型的分类变量,其含义并不直观,例如我们通常用0和1来区分性别,但如果缺乏上下文,其他用户很难区分0是代表男性还是女性,这时如果给数值添加标签,就方便用户理解了。为数值添加标签是通过以下两步来完成的。
第一步是定义数值标签,基本命令为:
label define lblname # "label" [# "label" ...] [, add modify nofix]
在这个命令中,lblname代表所要定义的数值标签名称,“#”代表所要定义的数值,"label"代表所要添加的标签内容。需要用户注意的是后方options的内容,其中add的作用是添加标签内容,modify的作用是对已存在的标签内容做修改,nofix的作用是要求Stata不为标签的内容而改变原变量的存储容量。
第二步是将所定义的数据标签与相关变量结合,基本命令为:
label values varname [lblname] [, nofix]
varname代表将要添加标签的变量名称,[lblname]代表刚刚定义的数据标签名称。
下面通过一个实例——给usaauto.dta数据库添加三类标签,将详细介绍标签的使用方法。usaauto数据文件如表2.1所示。
为整个数据库添加标签“1978年美国汽车产业的横截面数据”,其命令如下:
label data "1978年美国汽车产业的横截面数据"
为变量make和mpg添加标签“品牌”和“每加仑油行使里程数”,其命令如下:
label variable make "品牌"
label variable mpg "每加仑油行使里程数"
变量foreign为分类变量,0代表国产,1代表进口,为了便于观察,为0和1添加标签,具体命令为:
label define foreignlabel 0 "Domestic" 1 "Foreign"
label values foreign foreignlabel
其中,foreignlabel表示标签的名称,0 "Domestic" 1 "Foreign"表示定义的规则,数字0的标签是Domestic,数字1的标签是Foreign。
执行完命令之后,可以看到在数据表中,显示结果从图2.12变为图2.13。
标签添加完成以后,可以通过label dir命令,查看已经建立标签的相关内容。
sort命令的基本语句是:
sort varlist [in] [, stable]
varlist代表将要进行排序的变量名称,[in]代表排序的范围,[, stable]的含义是如果两个观测值相同,其顺序保持与原数据相同。
gsort命令的基本语句是:
gsort [+|-] varname [[+|-] varname ...] [, generate(newvar) mfirst]
其中需要说明的内容有两点:一,[+]表示按升序排列,这也是Stata默认的排列方式,[-]表示按降序排列;二,generate(newvar)表示排序之后生成新的变量,mfirst表示将缺失值排在最前面。
将usaauto数据文件中的观测值按变量price由小到大排列,这个操作可以用sort命令完成,具体操作如下:
sort price
当然也可以用gsort命令完成,具体操作如下:
gsort + price
drop命令是用来删除某些变量和观测值的,基本命令如下:
drop varlist [if] [in]
keep命令是用来保留某些变量和观测值的,基本命令如下:
keep varlist [if] [in]
例如,water数据文件包含4个变量,分别是year、capital、production、labor,将water数据文件拆分为两个数据文件:一个数据文件包含year和production两个变量,命名为wateroutput;另一个数据文件包含year、capital和labor三个变量,命名为waterinput。首先生成wateroutput文件:
use c:/data/water,clear
drop capital labor
save c:/data/wateroutput, replace
以上命令使用drop命令删除变量capital和labor,然后对其进行保存。同样我们可以用keep来决定保留变量。
use c:/data/water,clear
keep year capital labor
save c:/data/waterinput, replace
例如,将usaauto数据文件拆分为两个数据文件:一个数据文件为domesticauto,只包含国产车的相关内容;另一个数据文件为foreignauto,只包含进口车的相关内容,具体操作如下:
use c:\data\usaauto,clear
drop if foreign==1
save c:\data\domesticauto, replace
以上命令完成了第一个数据文件的建立,将foreign变量为1的数据删除并重新命名。
第二个数据文件建立的命令如下所示:
use c:\data\usaauto,clear
keep if foreign==1
save c:\data\foreignauto, replace
merge [varlist] using filename [filename ...] [, options]
其中,[varlist]代表合并进去的新变量,using filename指的是所要与原文件合并的文件路径,可选项options包含较多的功能,表2.11显示了其具体内容。
例如,利用横向拆分示例中生成的数据文件waterinput和wateroutput实现数据的横向合并,匹配变量为year,生成新的数据文件命名为waternew。使用命令如下:
use c:\data\wateroutput, clear
sort year
save c:\data\wateroutput, replace
use c:\data\waterinput, clear
sort year
merge year using c:\data\wateroutput
save c:\data\waternew, replace
在以上命令语句中,第1个命令语句实现了wateroutput数据文件的打开,第2个命令语句将文件按年份变量进行排序,第3个命令语句保存了排序之后的数据文件,第4个命令语句实现了waterinput数据文件的打开,第5个命令语句将此数据按年份变量进行排序,第6个命令语句按年份变量将wateroutput文件合并到waterinput文件中,第7个命令语句保存合并之后的数据文件。
操作完成以后我们可以发现多了一个名称为_merge的变量,这个变量将显示合并的情况,如果数值为3,则为合并成功,如果数值为1或2,则合并失败。
append using filename [, options]
[, options]的内容与merge相似,但更为简化。
例如,利用纵向拆分示例中生成的数据文件domesticauto和foreignauto实现数据的纵向合并,生成的数据文件命名为usaautonew。操作命令如下:
use c:\data\domesticauto, clear
append using c:\data\foreignauto
save c:\data\usaautonew, replace
在面板数据中,如果包含两个以上的标识变量,则数据有两种表现形式:一种是长数据,另一种是宽数据。在长宽数据的转换中,所使用到的命令为reshape命令,具体命令语句为:
reshape long stubnames, i(varlist) [options]
reshape wide stubnames, i(varlist) [options]
long表示将宽数据转化为长数据,wide表示将长数据转化成宽数据,stubnames表示需要转化的变量的名称前缀,i(varlist)表示识别变量。options最常用的为j(varname [values]),它表示用于进行长宽变换的变量,通常为时间变量。
例如实现表2.12和表2.13数据形式的转换,则必须使用本小节讲述的reshape命令。
将表2.12中的宽数据转化为表2.13中长数据的操作命令如下:
use c:/data/widedata, clear
reshape long english science, i(number name) j(year)
english和science为将要转化的变量名称的前缀,即将要生成的变量名称,i(number name) 表示识别变量,即按学号number和名称name区分所有观测值,j(year)表示按年份进行转化。
若要将上述长数据转化为宽数据,可使用操作命令如下:
use c:/data/longdata, clear
reshape wide english science, i(number name) j(year)
复习与习题
本章回顾
use [varlist] [if] [in] using filename [, clear nolabel]
compress [varlist]
destring [varlist], [generate (newvarlist) | replace] [options]
将数值型变量转化成字符型变量:
tostring [varlist], [generate (newvarlist) | replace] [options]
input [type] varname [[type] varname] …
insheet [varlsit] using filename [,options]
infile varlist [_skip[(#)] [varlist [_skip[(#)] ...]]] using filename [if]
[in] [, options]
infix using dfilename [if] [in] [, using(filename2) clear]
label data ["label"]
label variable varname ["label"]
label define lblname # "label" [# "label" ...] [, add modify nofix]
sort varlist [in] [, stable]
gsort [+|-] varname [[+|-] varname ...] [, generate(newvar) mfirst]
drop varlist [if] [in]
keep varlist [if] [in]
merge [varlist] using filename [filename ...] [, options]
append using filename [, options]
reshape long stubnames, i(varlist) [options]
reshape wide stubnames, i(varlist) [options]
习题