Stata小白系列之二:数据拆分与合并

论坛 期权论坛 期权     
Stata连享会   2019-2-22 09:25   18852   0
作者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云)
编者按: 从本期开始,Stata 连享会将推出「Stata小白系列」推文,介绍数据导入、命令语法等 Stata 入门知识,以帮助各位尽快掌握 Stata 的基本操作。
特别说明
文中包含的链接在微信中无法生效。请点击本文底部左下角的
  1. 【阅读原文】
复制代码
,转入本文
  1. 【简书版】
复制代码
Stata小白系列之一请参阅Stata小白系列之一:调入数据
三 数据拆分与合并
  • 数据拆分
  • 数据横向拆分——
    1. keep
    复制代码
    &
    1. drop
    复制代码
  • 数据纵向拆分——
    1. keep
    复制代码
    &
    1. drop
    复制代码
  • 一步到位保存数据子集——
    1. savesome
    复制代码
  • 数据合并
  • 数据的横向合并——
    1. merge
    复制代码
  • 数据的纵向合并——
    1. append
    复制代码
  • 对多个
    1. csv
    复制代码
    文件纵向合并——
    1. csvconvert
    复制代码
四 长宽数据转换—— `reshape`命令
  • 宽数据转为长数据
  • 长数据转为宽数据
数据文件下载:链接: https://pan.baidu.com/s/1qXRh9EG 密码: 5ltw
[h2]数据拆分[/h2]如果把内存中的数据集视为一个矩阵,则我们对数据的基本操作包括两类:删除列或删除行。对于 Stata 而言,命令的主要操作对象是变量 (矩阵的列),而有些时候我们也需要删除特定的观察值 (矩阵的行)。这些操作都可以配合使用
  1. drop
复制代码
  1. keep
复制代码
命令来实现。
[h3]删除\保留变量:数据的横向拆分[/h3]原始数据有时包含过多的变量,但在实际应用中可能根据需要将原始数据拆分为不同的数据表,这时就要实现数据的横向拆分。数据的横向拆分用到的两个命令为
  1. drop
复制代码
  1. keep
复制代码
Stata 范例:
    1. sysuse "auto.dta", clear
    复制代码
    1. drop weight length
    复制代码
    1. save "d:\data\auto_sim01.dta", replace
    复制代码
我们调入数据后,使用
  1. drop
复制代码
命令删除了两个变量,进而把处理后的数据文件另存到
  1. D:\data
复制代码
文件夹中。若该文件夹下已经存在一个名称为
  1. auto_sim01.dta
复制代码
则自动覆盖之,这是
  1. replace
复制代码
选项的作用。
按照上述思路,也就不难理解如下命令的含义了:
    1. sysuse "auto.dta", clear
    复制代码
    1. keep make price mpg rep78 foreign
    复制代码
    1. save "d:\data\auto_sim02.dta", replace
    复制代码
特别说明: 一般而言,除非数据文件非常大导致每次调入耗时较长,我们很少另存数据文件。我们会将主要的修改动作都保留于 dofile 中。每次分析时,只需修改 dofile 或执行 dofile 中的特定语句即可实现对子样本的处理。毕竟,dofile 本质上是文本文件,文件大小通常不过几十 k。
[h3]删除\保留观察值:数据的纵向拆分[/h3]原始数据有时包含过多的样本观测值,但在实际应用中可能根据需要将其按某种特征拆分为不同的数据表,这是就要实现数据的纵向拆分。此时,仍然可以使用
  1. drop
复制代码
  1. keep
复制代码
命令。
例如将
  1. auto.dta
复制代码
数据文件拆分为两个数据文件:
  1. auto_domestic.dta
复制代码
  1. auto_foreign.dta
复制代码
,操作如下:
    1. sysuse "auto.dta", clear
    复制代码
    1. keep if foreign==0
    复制代码
    1. save auto_domestic.dta, replace
    复制代码

    1. sysuse "auto.dta", clear
    复制代码
    1. keep= if foreign==1
    复制代码
    1. save auto_foreign.dta, replace
    复制代码
[h3]一步到位保存数据子集:
  1. savesome
复制代码
命令[/h3]通过上述范例可以看出,使用 Stata 自带的
  1. keep
复制代码
  1. drop
复制代码
命令可以快捷地删除变量或观察值,但在命令写法上较为繁琐。我们可以使用外部命令
  1. savesome
复制代码
来提高效率 (该命令是 Stata 官方命令
  1. save
复制代码
的扩展版):
  • 安装程序文件:
    1. ssc install savesome, replace
    复制代码
在命令窗口中输入
  1. help savesome
复制代码
可以查看该命令的帮助文件,其语法格式如下:
    1. savesome [varlist] [if exp] [in range] using filename [, old save_options]
    复制代码
其中,
    1. using filename
    复制代码
    表示要保存的子集文件名及文件路径;
    1. old
    复制代码
    是较为重要的选项,可以将数据保存为较低版本的文件格式,如 stata15 用户可以将数据另存为在 stata14 或以下版本中的打开的数据文件。类似的命令还有 Stata 官方命令
    1. saveold
    复制代码

Stata 范例 1:
对于前文提到的例子,我们可以使用
  1. savesome
复制代码
来实现相同的功能:
    1. sysuse "auto.dta", clear
    复制代码
    1. keep make price mpg rep78 foreign
    复制代码
    1. save "d:\data\auto_sim02.dta", replace
    复制代码
等价于
    1. sysuse "auto.dta", clear
    复制代码
    1. savesome make price mpg rep78 foreign ///
    复制代码
    1.    using "d:\data\auto_sim02.dta", replace
    复制代码
评论: 凭心而论,笔者更喜欢前一种方式。虽然多写了一行命令,但思路清晰,也便于记忆。
Stata 范例 2:
    1. sysuse "auto.dta", clear
    复制代码
    1. keep if foreign==0
    复制代码
    1. save auto_domestic.dta, replace
    复制代码
等价于:
    1. sysuse "auto.dta", clear
    复制代码
    1. savesome if foreign==0 using auto_domestic.dta, replace
    复制代码
[h2]数据合并[/h2][h3]数据的横向合并[/h3]数据的横向合并是横向拆分的逆操作,但是其要比拆分复杂。对于时间序列资料而言,要保证同一时点的两个变量的观察值对接到同一行;而对于界面个体资料而言,要保证同一个人的年龄数据与该人的收入数据在同一行。而对于面板数据资料,则需数据中有两个变量能够唯一标示每一行观察值,以保证 A 数据文件中的 “张三疯-2016” 与 B 数据文件中的 “张三疯-2016” 处于同一行。合并所使用的命令语句为
  1. merge
复制代码
,具体语句如下所示:
    1. merge [varlist] using filename [filename ...] [, options]
    复制代码
  1. merge
复制代码
为合并的命令语句,
  1. [varlist]
复制代码
代表合并进去的新变量,
  1. using filename
复制代码
指的是所要与原文件合并的文件路径,
  1. options
复制代码
包含较多的功能,表 2.11 显示了其具体内容。

举例:利用横向拆分实验中生成的数据文件
  1. waterinput
复制代码
  1. wateroutput
复制代码
实现数据的横向合并,匹配变量为
  1. year
复制代码
,生成新的数据文件命名为
  1. waternew
复制代码
。这个操作的命令为:
    1. use c:\data\wateroutput, clear
    复制代码
    1. sort year
    复制代码
    1. save c:\data\wateroutput, replace
    复制代码
    1. use c:\data\waterinput, clear
    复制代码
    1. sort year
    复制代码
    1. merge year using c:\data\wateroutput
    复制代码
    1. save c:\data\waternew, replace
    复制代码
在以上命令语句中,第一个命令语句实现了
  1. wateroutput
复制代码
数据文件的打开,第二个命令语句将文件按年份变量进行排序,第三个命令语句保存了排序之后的数据文件,第四个命令语句实现了
  1. waterinput
复制代码
数据文件的打开,第五个命令语句将此数据按年份变量进行排序,第六个命令语句按年份变量将
  1. wateroutput
复制代码
文件合并到
  1. waterinput
复制代码
文件中,第七个命令语句保存合并之后的数据文件。
数据的纵向合并
数据的纵向合并为数据纵向拆分的逆操作,使用的主要命令为
  1. append
复制代码
命令,具体语句如下:
    1. append using filename [, options]
    复制代码
在这个命令语句中,
  1. append
复制代码
是进行纵向合并的命令语句,
  1. using filename
复制代码
是进行纵向合并的文件路径,
  1. [, options]
复制代码
的内容与
  1. merge
复制代码
相似,但更为简化。
例如,利用纵向拆分实验中生成的数据文
  1. domesticauto
复制代码
  1. foreignauto
复制代码
实现数据的纵向合并,生成的数据文件命名为
  1. usaautonew
复制代码
。这个操作的命令为:
    1. use c:\data\domesticauto, clear
    复制代码
    1. append using c:\data\foreignauto
    复制代码
    1. save c:\data\usaautonew, replace
    复制代码
在以上命令中,第一个命令语句打开了原始数据文件,第二个命令将
  1. foreignauto
复制代码
文件合并到
  1. domesticauto
复制代码
文件中,第三个命令语句存储了合并后的数据文件。
一次合并多个csv文件——csvconvert
  1. csvconvert
复制代码
命令用于将多个
  1. csv
复制代码
格式文件合并为一个
  1. .dta
复制代码
格式文件,比较适合处理具有时间周期性特点的变量。命令:
    1. csvconvert input_directory , replace [options]
    复制代码
该命令有三个参数:
参数名功能output_file(file_name)设置输出文件名output_dir(output_directory)设置输出路径input_file(.csv file list)选择要合并的文件命令下载:
    1. help csvconvert
    复制代码
以命令配套的四个世界银行文件为例,首先看文件结构
    1. dir C:\Uers\Administrator\Desktop\stata学习文件\worldbank\*.csv
    复制代码


wb2010.csv使用
  1. csvconvert
复制代码
命令将四个年度数据纵向合并
  1. csvconvertC:\Users\Administrator\Desktop\stata学习文件\worldbank,replace
复制代码

默认情况下合并后的文件名为output.dta要合并的四个子文件必须在同一个文件夹中,默认情况下,
  1. csvconvert
复制代码
命令会合并文件夹中所有文件 ,可以用
  1. note
复制代码
命令核对所合并的文件情况 .用
  1. input_file
复制代码
参数选择所有合并的文件名,在此,我们只选择2008年度和2009年度的数据
    1. csvconvert C:\Users\Administrator\Desktop\stata学习文件\worldbank
    复制代码
    1. , replace input_file(wb2008.csv wb2009.csv)
    复制代码
本文中所用数据文件下载地址:
数据文件:链接: https://pan.baidu.com/s/1qXRh9EG 密码: 5ltw
特别说明
文中包含的链接在微信中无法生效。请点击本文底部左下角的
  1. 【阅读原文】
复制代码
,转入本文
  1. 【简书版】
复制代码
[h3]关于我们[/h3]
  • 【Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。
  • 公众号推文同步发布于 CSDN-Stata连享会 、简书-Stata连享会 和 知乎-连玉君Stata专栏。可以在上述网站中搜索关键词
    1. Stata
    复制代码
    1. Stata连享会
    复制代码
    后关注我们。
  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
  • Stata连享会 精彩推文1 || 精彩推文2
[h3]联系我们[/h3]
  • 欢迎赐稿: 欢迎将您的文章或笔记投稿至
    1. Stata连享会(公众号: StataChina)
    复制代码
    ,我们会保留您的署名;录用稿件达
    1. 五篇
    复制代码
    以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
  • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。
  • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
  • 联系邮件: StataChina@163.com
[h3]往期精彩推文[/h3]


欢迎加入Stata连享会(公众号: StataChina)
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:190
帖子:39
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP