Stata数据处理:纵横长宽转换-reshape的兄弟-gather和spread.md

发布时间:2020-10-19 阅读 1704

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 华晨 (西南财经大学)
邮箱: huachen0108@foxmail.com

编者按: 这篇推文最早于 2018 年成文,那时候华晨还在 The University of Manchester 读博士。目前,他已经入职西南财经大学,开启自己的教师生涯了。(by 连玉君 2021/1/10 16:56)


目录


1. 简介

在处理纵横变换数据时,Stata 官方提供的 reshape 命令十分便捷,但运算速度相对较慢。此时,可以使用外部命令 sreshapefastreshape 来转换大型数据,速度可以提升 5-30 倍。本文介绍的 gatherspread 命令则可以处理上述命令都无法很好解决了的一类问题。

"扁担长,板凳宽,板凳没有扁担长,扁担没有板凳宽。"长长宽宽绕不清。一些 Stata 的初学者也绕不清长宽数据的转换。应该是 reshape long 呢?还是 reshape wide 呢? i 又是什么? j 又是什么?……

头昏眼花了对不对!的确,Stata 官方的 reshape 命令在使用的时候会有不便。比如, reshape long 会要求被转置的变量名要有相同前缀,诸如此类。那有没有更 (jian) 人 (dan) 性 (cu) 化 (bao) 的方法呢?当然有啦,不然这篇推文的意义何在。

在介绍更简单的长宽转换命令前,初学者需要明白什么叫长宽转换。简单地说: 原来横着的行,你却想把它竖起来,这就是“宽变长”; 原来竖着的列,你却想把它横过来,那就是“长变宽”。

2. 神奇的 gather 和 spread 命令

说了半天,是什么神奇的命令呢?灯灯灯等!是 gatherspread

gather 负责宽变长,spread 负责长变宽。

要感受它们的神奇,你首先得安装它们,执行以下命令:

ssc install tidy

接下来就直接来看例子吧。

首先我们调入一个 Stata 自带的发达国家教育经费占 GDP 比重的数据。它包含了 3 个变量和 10 个观察值。第一列是国家名称,第二列是公共部门教育花销占 GDP 的比重,第三列是私有部门教育花费占 GDP 的比重。

sysuse educ99gdp.dta, clear

下面我们想把这个宽数据变长,也就是让每一个国家的公共部门教育花费占比和私有部门教育花费占比以不同观察值来呈现,通俗地讲就是各处一行。那么,整个数据集将扩充成 20 个观察值。执行以下命令:

gather public private

对于一个国家(观测值)来说,public 和 private 各部门的取值本来是横着的,我们想让它们竖起来,就在 gather 后面指定想要竖起来的变量名就可以了。

执行完后数据集变成什么样子了呢?

的确变成了一个含有 20 个观察值的数据。第一列仍然是国家名称,如预期一般,每个国家出现了两次。第二列是自动生成的变量 variable ,它其实是将我们指定的原先横着的变量给竖起来了,并将原来的变量名作为新变量的取值来标识这一行。第三列也是自动生成的变量 value,它就是教育花费占比的取值。

是不是很简 (cu) 单 (bao) ?

当然我们还可以自定义 variable 和 value 两个变量的名称,使得新数据的变量名有更清晰的含义。执行以下代码:

sysuse educ99gdp.dta, clear
gather public private, variable(sector) value(GDP)

我们得到如下数据

注意到,两个新生成的变量名称改变成我们自定义的名称了。

有人要说了,想变回去怎么办呢?长变宽? 执行以下命令:

spread sector gdp

又变回了最初宽数据的形态。是不是很 easy?

这里需要注意的是 spread 命令中指定的变量名的顺序。 其实,就我的理解,长宽转换的本质是一个类别变量的取值在二维表里如何呈现的问题:如果将类别变量的各个类别取值放在变量名里,则是一个宽数据;如果将类别变量的各个取值放在同一个变量里,则是一个长数据。

spread后面指定的第一个变量名一定是那个类别变量。建议这个类别变量使用字符型变量(红色的)。如果是数值型变量但是加了变量取值标签(蓝色的),生成的新变量的名称含义就不是那么直接了,有兴趣的胖友可以自己试一下。

最后,还在 reshape上挣扎的胖友们,还不赶紧试试?

3. 样例代码

ssc install tidy, replace

*- Wide to long
   sysuse educ99gdp.dta, clear
   gather public private

*- Wide to long with renaming new variables
   sysuse educ99gdp.dta, clear
   gather public private, variable(sector) value(gdp)


*- Long to wide

   * Create the long data set first
     sysuse educ99gdp.dta, clear
     gather public private, variable(sector) value(gdp)

   * Reshape long to wide
     spread  sector gdp

4. 相关推文

Note:产生如下推文列表的命令为:
lianxh lianxh reshape 普林斯顿, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh