stata stata学习stata

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

2018-04-03  本文已影响825人  stata连享会

作者:连玉君 (知乎 | 简书 | 码云)

Stata 现场培训报名中

1. 问题背景:

图1:待处理的 3500 个文件 (部分显示)

2. 解决思路:

  local s: dir "D:\data\idata'"  files "*.dta",  respectcase
图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

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

关于我们

联系我们

往期精彩推文

Stata连享会推文列表

Stata 现场培训报名中

连玉君Stata现场班报名中

欢迎加入Stata连享会(公众号: StataChina)
上一篇下一篇

猜你喜欢

热点阅读