这是教对象Stata系列视频的配套代码。对应视频与笔记链接请见下方链接,配套代码请见分割线下方。

视频合集

bilibili视频链接

配套笔记链接


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/* Do File Note:
日期:2023年2月1日
系列:教对象Stata系列
主题:循环语句的使用
内容:1. foreach 命令: 列表循环 —— 文本/数值
2. forvalues 命令: 数列循环 —— 数值
3. 简单案例:
4. 综合案例: 循环语句嵌套 */


************************** 一、foreach 命令: 列表循环 **************************
** 1. local —— 局部宏
local grains "rice wheat corn rye barley oats"
foreach x of local grains {
display "`x'"
}
// 等效命令
foreach x in rice wheat corn rye barley oats {
display "`x'"
}

** 2. global —— 全局宏
global money "Franc Dollar Lira Pound"
foreach y of global money {
display "`y'"
}
// 等效命令
foreach y in Franc Dollar Lira Pound {
display "`y'"
}
// global指代特定文本
webuse womenwage, clear
global Xlist "age age2 nev_mar rural school tenure wage wagecat"
corr $Xlist
collin $Xlist

** 3. 三种列表
** 3.1 varlist - 变量列表
foreach v of varlist age* rural-wage {
summ `v'
}
// 等效命令
foreach v in age* rural-wage {
summ `v'
}

** 3.2 newlist - 新变量列表
foreach v of newlist z1-z20 {
gen `v' = .
}
// 等效命令
forvalues n = 1/20 {
gen z`n' = .
}

** 3.3 numlist - 数列
** 3.3.1 简单、有规律的数列
foreach n of numlist 1/7 {
display `n'
}
// 等效命令
forvalues n = 1/7 {
display `n'
}
** 3.3.2 不规则数列
foreach n of numlist 1 4/8 13(2)21 {
display `n'
}


************************* 二、forvalues 命令: 数列循环 *************************
** 1. 间隔默认为1
forvalues i=4/8 {
display `i'
}

** 2. 间隔为2
forvalues i=13(2)22 {
display `i'
}

** 3. 间隔为3
forvalues i=5 8 : 21 {
display `i'
}


********************************* 三、简单案例 *********************************
* 内容: 将逐年的风速、降水、日照、湿度数据合并为一个数据

cd "C:/Users/wugan/Desktop/教对象Stata系列/第5课:循环语句的使用/示范数据"
// 【`】输入方式——tab键上面的,英文波浪号键,【'】英文引号键
global type "风速 日照 湿度 降水"
foreach t of global type {
** 1. 数据导入
forvalues y = 2000/2020 {
import excel "气象数据/2000-2020年逐年`t'/【`y'年】逐年`t'.xlsx", firstrow sheet("Sheet1") clear
tostring 年份 省份 城市 城市代码, replace
save "气象数据/Stata_Data/`y'-`t'.dta", replace
}
** 2. 数据接驳 —— 将不同年份的数据进行拼接
use "气象数据/Stata_Data/2000-`t'.dta", clear
forvalues y = 2001/2020 {
append using "气象数据/Stata_Data/`y'-`t'.dta"
}
save "气象数据/Stata_Data/`t'.dta", replace
}

** 3. 数据匹配
use "气象数据/Stata_Data/风速.dta", clear
foreach t in 日照 湿度 降水 {
merge 1:1 年份 城市 using "气象数据/Stata_Data/`t'.dta", nogen
}
save "气象数据/Stata_Data/气象数据", replace
// 问题1: 关注merge错误: 使用nogen / 删除_merge
** 4. 删除临时的数据
foreach t of global type {
forvalues y = 2000/2020 {
rm "气象数据/Stata_Data/`y'-`t'.dta"
}
}


******************************* 四、循环语句嵌套 *******************************
* 相关链接:「循环语句嵌套」https://zhuanlan.zhihu.com/p/534643804
* 内容: 使用2012-2018年CFPS数据生成分城乡、分省份的各类消费均值数据
* 1) 划分城乡类型
* 2) 筛选所需数据
* 3) 分省份、分城乡计算各类消费均值数据
* 4) 导出所需数据

forvalues y = 2012(2)2018 {
use "CFPS/raw_data/cfps`y'famecon.dta",clear
** 1. 划分城乡类型: 不同年份问卷的城乡指标变量不同
if `y'==2012 {
gen type="城镇" if fa0==1, after(provcd)
replace type="农村" if fa0==5
}
if `y'==2014 {
gen type="城镇" if fa1==1, after(provcd)
replace type="农村" if fa1==5
}
if `y'>=2016{
gen type="城镇" if fa1==1 | (inlist(fa1,-1,-8,77) & fa101==1), after(provcd)
replace type="农村" if fa1==5 | (inlist(fa1,-1,-8,77) & fa101==5)
}
** 2. 变量与样本筛选: 删除无法区分城乡的样本、删除多余变量
keep if type!="" & provcd!=.
label var type "城乡类型划分"
global Xlist "daily dress eec food house med trco pce other eptran epwelf mortage expense"
keep provcd type $Xlist
** 3. 分组计算各类支出的均值
foreach v of global Xlist {
ereplace `v'=mean(`v'), by(provcd type)
}
** 4. 删除重复样本
duplicates drop type provcd, force // 与ereplace的by分组相同
sort provcd
save "CFPS/CFPS`y'",replace
** 5. 数据导出
local type "城镇 农村"
foreach t of local type {
use "CFPS/CFPS`y'", clear
keep if type=="`t'"
export excel "CFPS/分省分城乡家庭支出.xlsx", sheet("`y'-`t'", replace) firstrow(varl)
}
}


// 问题2: 关注if条件的使用 —— line 145
// 问题3: 关注数据格式 —— line 140
// 问题4: 关注local的重复使用 —— line 162
// 问题5: 关注数据的保存与打开 —— line 164