memo :循环
0.生成数据
** 生成数据 **
clear all
set obs 28
set seed 123
egen id = repeat(), v(1/4)
egen cou = ntos(id), from(1/4) to(CHN USA FRA RUS)
sort id
egen year = repeat(), v(2011/2017)
gen sd = rnormal()
sort sd
gen value = _n * 2
sort id year
gen r1 = year* 0.1 + runiform() * 100
gen r2 = runiform() * 100 + id * 500 + rnormal()
gen r3 = (year - 1000) + runiform() * id* 500
gen r4 = 1
drop sd
label var r1 "GDP"
label var r2 "gdp"
label var r3 "FDI"
cap snapshot erase 1
snapshot save, label("data")
1.forvalues——针对数值的循环
A "数值"可以指代样本
(1)直接写 vs 循环
**# *** forvalues : 对“数值”进行循环 ***
** 直接写 **
snapshot restore 1 //restore the data
replace r4 = r4 + 2012 if year == 2012
replace r4 = r4 + 2013 if year == 2013
replace r4 = r4 + 2014 if year == 2014
replace r4 = r4 + 2015 if year == 2015
replace r4 = r4 + 2016 if year == 2016
** 写成循环 **
snapshot restore 1
forvalues i = 2012/2016{
replace r4 = r4 + `i' if year == `i'
}
(2)步长
snapshot restore 1
** 步长 **
/*
forvalues i = 2012(1)2016{ // 2012 2013 2014 2015 2016
replace r4 = r4 + `i' if year == `i'
}
*/
forvalues i = 2012(2)2016{ // 2012 2014 2016
replace r4 = r4 + `i' if year == `i'
}
(3)新的暂元
snapshot restore 1
** 新的暂元 **
forvalues i = 2012/2016{
local j = `i' / 2
replace r4 = r4 + `j' if year == `i'
}
B“数值”可以指代变量
** 直接写 **
/*
snapshot restore 1
gen lnr1 = ln(0.01 + r1)
drop r1
gen lnr2 = ln(0.01 + r2)
drop r2
gen lnr3 = ln(0.01 + r3)
drop r3
gen lnr4 = ln(0.01 + r4)
drop r4
*/
** 写成循环 **
snapshot restore 1
forvalues i = 1/4{
gen lnr`i' = ln(0.01+r`i')
drop r`i'
}
2.foreach——针对对象的循环
A "对象"可以指代变量
(1)现存变量
snapshot restore 1
** 现存变量 **
foreach i of var r1 r2 r3 r4 {
gen ln`i' = ln(0.01+`i')
drop `i'
}
(2)新变量
snapshot restore 1
** 新变量 **
foreach i of newlist z1-z20 {
gen `i' = runiform()
}
(3)简化
** 可简化成 (使用 "暂元 in 对象" 的句式 无需强调对象的属性)
foreach i in r1 r2 r3 r4 {
gen ln`i' = ln(0.01+`i')
drop `i'
}
B "对象"可以指代数值
snapshot restore 1
foreach i of numlist 2012 2013/2015 2016 {
local j = `i' / 2
replace r4 = r4 + `j' if year == `i'
}
B "对象"可以指代字符串
snapshot restore 1
discard
foreach i in CHN USA {
line r1 year if cou == "`i'" , subtitle("`i'") name(`i')
}
graph combine CHN USA, xsize(35) ysize(15)
3.while——基于判定的循环
只要年份小于2016年,就把value替换成0
clear
set obs 10
gen year = _n + 2010
gen value = runiform()* 200
local i = 2011
while `i' < 2016 {
replace value = 0 if year == `i'
local i = `i' + 1
}