preserve restore——stata的起死回生之术

2016-11-14 余金馨 爬虫俱乐部 爬虫俱乐部

哈喽,诸君安啊!偷偷告诉各位,小编今天要跟大家分享的东西可不得了了,有stata中起死回生术之称。Stata中,为了使部分程序的运行不影响之前的内容,我们一般会使用起死回生命令“preserve ,restore”。

起 死回生的秘密:preserve 命令可以把之前的内容保存在一个临时内存空间中,这样保存的文件,无论 preserve 以后我们对文件进行什么操作,都可以随时通过restore将preserve命令之前的文件恢复到内存中,继续使用。这意味着,在preserve 后我们可以肆无忌惮的折腾数据,只要restore一下,原数据就会重现~~~

一、preserve,restore,起死回生



以如下C刊目录源数据(数据已放入百度云中供大家下载,链接如下:http://pan.baidu.com/s/1c2IE2g4)的整理为例让我们感受起死回生的神奇~:


infix strL var 1-200 using C刊目录源数据.txt, clear

导入C刊目录源数据后,我们会发现stata只有一个变量v,要整理该数据,我们需要把所有期刊名称、主办单位和CN号分别提取出来并相对应地放入三个变量中。preserve,restore可以保证我们提取期刊名称后的数据依然可用于提取主办单位、CN号。

首先我们删去不需要的字符串观测值,并为每种期刊生成id,便于期刊名称、主办单位和CN号提取出来后能一一对应。

drop if var=="期刊名称"

drop if var=="主办(管)单位"

drop if var=="CN号"

drop if var==""

drop if regexm(var,"([0-9]+种)")

gen id = (mod(_n,3)==1)

replace id = sum(id)
分析后我们发现,期刊名称所在行数除以三余一,主办单位所在行数除以三余二,而CN号所在行数能整除三。借此规律,我们可以提取期刊名称、主办单位、CN号。

在这个过程中preserve restore就会为我们展示每次提取后原数据是如何起死回生的:

preserve 

keep if mod(_n,3)==1

rename var journal

sort id

save 期刊名称,replace

restore

br后我们发现内存中的数据并没有变,而期刊名称文件中只保留了所有期刊的名称(若没有preserve restore,我们内存中的数据就只剩了期刊名称)。
因此,我们可以放心地提取主办单位和CN号

preserve 

keep if mod(_n,3)==2

rename var publisher

sort id

save 主办单位,replace

restore

preserve 

keep if mod(_n,3)==0

rename var CN

sort id

save CN号,replace

restore

至此我们运用preserve restore的起死回生对原数据做了三次不同的处理,得到了期刊名称、主办单位、CN号三个数据文件。接下来我们可以用merge命令将这三个数据文件根据id号横向合并在一个数据文件中,这也是我们最开始生成id号的原因。

use 期刊名称,clear

sort id

merge 1:1 id using 主办单位

drop _m

 

sort id

merge 1:1 id using CN号

drop _m

drop id

save CSSCI, replace

结果如下:
二、preseve,restore循环,生生不息



preserve,restore是最基础却最好用的命令,它可以满足我们对数据进行多次不同处理的需求。试想我们将其写入循环,我们就可以对一个数据文件进行足够多的数据处理达到我们的目的。比如我们想将cntrade所下载的浦发银行股票数据按照按照年份拆分保存,首先我们用cntrade命令下载浦发银行数据并生成年份:

clear

cap mkdir "C:\cntrade"

cd c:\cntrade

cntrade 600000

gen year = year(date)

结果如图所示:

我们很容易想到:

keep if year == 2016

save 浦发银行_2016

这 样就把2016年的数据拆分并保存下来了。但是,命令运行完之后,我们其他的数据被deleted掉了,无法继续保存其他年股票的数据了。这时候 preserve,restore就可以大显身手,由于年份从1999到2016太多,我们将preserve,restore写入小循环中就可以省去一 遍又一遍的keep if,得到每一年的数据。命令如下:

forv i = 1999/2016{

preserve

keep if year == `i'

save 浦发银行_`i'

restore

}

运行结果如下:

Stata的起死回生命令和循环命令结合起来是不是更神奇了呢,只要一个preserve,restore就可以让你的数据生生不息~

我们的第一个例子c刊目录源数据整理,将preserve,restore写进循环也会更简洁,附循环命令程序供读者参考学习:

clear

cd c:\CSSCI

infix strL var 1-200 using C刊目录源数据.txt, clear

drop if var=="期刊名称"

drop if var=="主办(管)单位"

drop if var=="CN号"

drop if var==""

 

drop if regexm(var,"([0-9]+种)")

gen id = (mod(_n,3)==1)

replace id = sum(id)

 

local i = 0

foreach c in CN号 期刊名称 主办单位 {

preserve

keep if mod(_n,3) == `i'

rename var `c'

sort id

save `c'.dta, replace

local i = `i' + 1

restore

}

use 期刊名称,clear

sort id

merge 1:1 id using 主办单位

drop _m

sort id

merge 1:1 id using CN号

drop _m

drop id

save c:CSSCI, replace

以上就是今天小编与大家分享的全部内容了,如果各位看官喜欢今天的分享,不要吝啬您的打赏哦!~~想了解更多有关stata的小秘密,请继续关注我们的公众号哦,更多惊喜等着您!~~

编辑by谢慧蓉 徐苾雯



往期推文推荐:

1.天路——chinafin与cntrade命令

2.分时数据,从此唾手可得

3.有了这个命令,以后还怕重复?

4.esttab功能挖掘:“Yes”or“No”

5.用“套路”处理数据

6.厉害了,我stata哥

7.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

8.据说这样数据替换比较快,你试一下,然后……

9.众里寻她千百度,synth命令来帮助!

10.I have a Stata, I have a python

11.用subinfile修改文件,滚蛋吧,繁琐的命令君!

12.删繁就简三秋叶,subinfile似剪刀


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:xueyuan19920310@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



长按二维码关注你懂哟!~~

微信扫一扫
关注该公众号