哈喽,诸君安啊!偷偷告诉各位,小编今天要跟大家分享的东西可不得了了,有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谢慧蓉 徐苾雯
往期推文推荐:
7.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度
10.I have a Stata, I have a python
长按二维码关注你懂哟!~~
微信扫一扫
关注该公众号