Stata: 如何快速合并 3500 个无规则命名的数据文件?

发布时间:2020-07-22 阅读 887

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

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

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

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

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

作者:连玉君 (中山大学)
E-Mail: arlionn@163.com


目录


数据合并专题

1. 问题背景

  • (1) 在 idata 文件夹下存放了 3500 个个股日交易资料的 .dta 数据文件。这些文件采用公司代码命名,因此,并不连续(参见 图 1);
  • (2) 任务:(a) 部分文件中的 turnover 变量是文字型变量,需要使用 destring 命令将其转换为数值变量;(b) 将这 3500 个数据文件纵向合并起来 (append);
  • (3) 使用 forvalues 语句无法奏效,因为文件名对应的数字不连续;
图1:待处理的 3500 个文件 (部分显示)
图1:待处理的 3500 个文件 (部分显示)

2. 解决思路

  • (1) 使用 foreach 语句对无规则的文件名进行循环处理;
  • (2a) 难点: 如何提取文件名到一个暂元或变量中?
  • (2b) 对策: 使用 dir 命令以及暂元的高级功能,将 dir 查询到的文件名存放到一个暂元 s中,随后在循环语句中从 s 暂元中提取文件名;
  • (3) 关键命令: 提取特定文件夹下的所有文件的名称到一个暂元 s 中,可以使用如下语句(详情参见 help macro,以及 help extended_fcn):
  local s: dir "D:\data\idata'"  files "*.dta",  respectcase
  • 命令含义:
图2:暂元高级功能释义
图2:暂元高级功能释义

执行如下语句可以在屏幕上呈现暂元 s 中存放的内容,如 图 3 所示:

. local s: dir "D:\data\idata'"  files "*.dta",  respectcase
. dis `"`s'"'

图3:暂元 s 中存放的内容 )

3. 采用循环语句将 turnover 变量转换为数值变量

global d "D:\data\idata"
cd "$d"
local s: dir "`d'"  files "*.dta",  respectcase
foreach i  in `s' {
  use "`i'", clear
  dis in red "ID = `i'"  //可以不要,只是为了标示公司代码
  destring turnover, replace force  
  qui save "`i'", replace 
  dis "." _c     //屏幕打点,纯属娱乐
}

4. 合并 3500 个数据文件

4.1 方法1:使用 foreach 语句

使用 append 命令可以合并纵向合并文件中的 3500 个文件,但有一个棘手的问题:使用 append 命令时,必须先将第一份数据调入内存,然后将剩余的 3499 份文件追加到这份文件的尾部。

然而,我们的数据文件名称是没有特定规则的,这就需要采用一种自动提取文件名的机制。此时,可以使用 gettokentokenize 命令对暂元 s 进行切割,其包含的第一个单词就是第一个文件的名称。这里以 gettoken 为例进行说明。

gettoken 的用法
  local a "Jack Rose Make Love"
  gettoken s1 s2: a, parse(" ")
  dis "`s1'"
  dis "`s2'"

结果如下:

.   dis "`s1'"
Jack

.   dis "`s2'"
 Rose Make Love

可见,gettoken 的作用是将暂元 a 的内容按照我们的要求以空格 (parse(" ") 的作用) 为切割点,分成两部分,第一空格之前的部分存入暂元 s1,剩余部分存入暂元 s2

合并数据的命令
* 4.1 方法1:使用 foreach 语句
  local s: dir "$d"  files "*.dta",  respectcase
  gettoken f1 frest: s, parse(" ")
  dis "`f1'"        //第一个文件的名称
  dis `"`frest'"'   //其他文件的名称
  
  use "`f1'", clear
  foreach i of local frest {
    append using `i'
  }  
  save "D:\data\idata_all01.dta", replace //保存合并后的数据

4.2 方法2:使用外部命令 openall

若使用外部命令 openall,则上述繁杂的处理过程会简化成一条极其简洁的语句:

  cd "D:\data\idata"  // 将要合并该文件夹下的所有文件
  openall *           // 纵向合并当前工作路径下的所有文件
  save "D:\data\idata_all02.dta", replace //保存合并后的数据

可以使用如下命令安装外部命令 openall

ssc install openall, replace

详细语法格式参见:help openall

有兴趣的话,你可以对比一下上述两份最终文件是否有差异。

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 因果推断, 空间计量,寒暑假班等
数据清洗系列 游万海 直播, 88 元,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

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

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

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

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