《Stata统计分析与应用(第2版)》一2.3 数据的整理-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《Stata统计分析与应用(第2版)》一2.3 数据的整理

简介:

本节书摘来自华章出版社《Stata统计分析与应用(第2版)》一书中的第2章,第2.3节,作者 周广肃,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.3 数据的整理

本节将介绍数据整理的相关内容,主要包括数据的标签与排序、数据拆分、数据合并和数据的长宽转换等内容。

2.3.1 数据的标签与排序

  1. 数据标签
    为了让用户更加清楚地了解数据来源、变量含义、观测值等相关内容,Stata可以为数据、变量、观测值添加标签,其实标签就是对相关数据的解释。最常用的标签方法有三类:一是为数据库添加标签,二是为变量添加标签,三是为观测值添加标签。

为数据库添加标签的基本命令为:

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。

image

标签添加完成以后,可以通过label dir命令,查看已经建立标签的相关内容。

  1. 排序数据
    为了处理数据的方便,有时需要对数据进行排序处理。在Stata中排序的命令主要有两个:一个是sort命令,另一个是gsort命令。

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

2.3.2 数据的拆分

  1. 数据的横向拆分
    原始数据有时包含过多的变量,但在实际应用中可能根据需要将原始数据拆分为不同的数据表,这时就要实现数据的横向拆分。数据的横向拆分用到的两个命令为drop和keep,下面做一下详细的讲解。

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
  1. 数据的纵向拆分
    原始数据有时包含过多的样本观测值,但在实际应用中可能根据需要将其按某种特征拆分为不同的数据表,这就是将要实现数据的纵向拆分。数据的纵向拆分用到的主要命令还是drop和keep。

例如,将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

2.3.3 数据的合并

  1. 数据的横向合并
    数据的横向合并是横向拆分的逆操作,但是其要比拆分复杂,因为合并时要实现同一个数据的对接,而不能出现对接错误的情况,所以在横向合并之前最好先对数据进行排序处理,然后实现合并。合并所使用的命令语句为merge,具体语句如下所示:
merge [varlist] using filename [filename ...] [, options]

其中,[varlist]代表合并进去的新变量,using filename指的是所要与原文件合并的文件路径,可选项options包含较多的功能,表2.11显示了其具体内容。
image

例如,利用横向拆分示例中生成的数据文件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,则合并失败。

  1. 数据的纵向合并
    数据的纵向合并同样可视为数据纵向拆分的逆操作,使用的主要命令为append,具体语句如下:
append using filename [, options]

[, options]的内容与merge相似,但更为简化。
例如,利用纵向拆分示例中生成的数据文件domesticauto和foreignauto实现数据的纵向合并,生成的数据文件命名为usaautonew。操作命令如下:

use c:\data\domesticauto, clear
append using c:\data\foreignauto
save c:\data\usaautonew, replace

2.3.4 数据的长宽转换

在面板数据中,如果包含两个以上的标识变量,则数据有两种表现形式:一种是长数据,另一种是宽数据。在长宽数据的转换中,所使用到的命令为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命令。
image
image

将表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)

复习与习题
本章回顾

  1. 打开数据文件的基本命令:
use [varlist] [if] [in] using filename [, clear nolabel]
  1. Stata常用的数据类型主要有三类,即数值型、字符型和日期型。
  2. 数据压缩的主要命令:
compress [varlist]
  1. 数据类型的转化主要有两类:
    将字符型变量转化成数值型变量:
destring [varlist], [generate (newvarlist) | replace] [options]

将数值型变量转化成字符型变量:

tostring [varlist], [generate (newvarlist) | replace] [options]
  1. 在Stata中创建数据库有两种方法,一种为菜单法,另一种为命令法。命令为:
input [type] varname [[type] varname] …
  1. 导入不同格式数据的三种命令:
insheet [varlsit] using filename [,options]
infile varlist [_skip[(#)] [varlist [_skip[(#)] ...]]] using filename [if] 
[in] [, options]
infix using dfilename [if] [in] [, using(filename2) clear]
  1. 为数据添加标签的命令为:
label data ["label"]
label variable varname ["label"]
label define lblname # "label" [# "label" ...] [, add modify nofix]
  1. 数据排序的命令为:
sort varlist [in] [, stable]
gsort [+|-] varname [[+|-] varname ...] [, generate(newvar) mfirst]
  1. 数据拆分的相关操作和命令:
drop varlist [if] [in]
keep varlist [if] [in]
  1. 数据合并的相关命令为:
merge [varlist] using filename [filename ...] [, options]
append using filename [, options]
  1. 长宽数据转化的相关命令为:
reshape long stubnames, i(varlist) [options]
reshape wide stubnames, i(varlist) [options]

习题

  1. 将如表2.14所示的数据内容输入到Stata中,命名为zuoye2.1,并将此数据文件进行压缩。
    image
  1. 将数值型变量math和chinese转换成字符型变量,然后再将其转换成数值型变量。
  2. 为数据库zuoye2.1添加标签“学生成绩”,为math变量添加标签“数学成绩”,为分类变量gender添加标签,1为“male”,0为“female”。
  3. 使用两种命令将数据库zuoye2.1按照数学成绩进行排序。
  4. 将zuoye2.1数据库横向拆分为如表2.15和表2.16所示的两个数据表,然后再将其横向合并。
    image
  1. 将zuoye2.1数据库纵向拆分为如表2.17和表2.18所示的两个数据表,然后将其纵向合并。
    image
  1. 将如表2.19所示的数据内容输入到Stata中,命名为zuoye2.2,并将其转换成长数据,然后再将其转回宽数据。

image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接