这是教对象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
/* Do File Note:
日期:2023年1月18日
主题:stata 变量管理、IF条件使用
内容:1. 变量管理(1): 变量生成与取值替换
2. IF条件的使用
3. 变量管理(2): 重命名、标签、排列、删除与保留 */

******************************** 一、变量管理(1) ********************************
* 相关链接:
* 1)「Stata变量生成与替换」https://fgzfgz.github.io/posts/9680/
* 2)「Stata字符型变量运算」https://fgzfgz.github.io/posts/45943/

cd "C:/Users/wugan/Desktop/教对象Stata系列/第2课:变量管理与IF条件使用"
** 1. 数值型变量
webuse renamexmpl, clear
** 1.1 变量生成与数值替换
gen X=. // 变量生成 —— generate 简写为 gen 或 g
replace X=2 // 数值替换
** 1.2 四则运算、对数、指数、幂运算
replace X=X+1 // 加法
replace X=X-1 // 减法
replace X=X*3 // 乘法
replace X=X/3 // 除法
replace X=ln(X) // 自然对数
replace X=log10(X) // 以10为底的对数
replace X=3^X // 指数运算
replace X=exp(X) // 自然指数
replace X=X^2 // 幂运算
rename inc income
** 1.3 取整函数
gen inc_ceil=ceil(income) // 大于或等于income取值的最小整数
gen inc_floor=floor(income) // 小于或等于income取值的最大整数
gen inc_int=int(income) // 取整函数: 各位
gen inc_round=round(income) // 取整函数: 个位
gen inc_round=round(income,.01) // 取整函数: 百分位
gen inc_round=round(income,7) // 取整函数: income取值最接近的7的整数倍
** 1.4 余数函数
gen inc_mod=mod(income,2) // 余数函数: income除以2的余数
** 2. 字符型变量
gen X1="" // 生成字符型缺失值
replace X1="NA"
gen X2="缺失值"
gen Y2=income+X2 // 类型不同无法相加
gen Y=X1+X2 // 字符型变量相加
// 字符提取
use "气象数据.dta", clear
// str——string
gen provincename=usubstr(province,1,2) // 提取2个中文字符: 从第1位开始提取, 提取两位
gen birthyear=usubstr(ID,7,4) // 提取数字: 在身份证号ID中,从第7位开始提取4位数字,作为出生年份
gen region_type=usubstr(province,-1,.) // 提取最后1个字符: "-1"表示从右向左数1个字符,"."表示提取至最后一位

** 3. gen 与 replace 的扩展: egen 与 ereplace
/* 目标: 依据省份与年份分组,计算以下内容:
1)分组:生成分组顺序数
2)计数:地级市数量
3)加总值/平均值/标准差/最大值/最小值
4)合并地址信息
5)分位数
6)数列
7)行运算 */
** 3.1 分组:生成分组顺序数
egen ProvinceGroup=group(province year) // 缺失值为一组
** 3.2 计数:地级市数量
egen city_num=count(city), by(province year)
** 3.3 加总值/平均值/标准差/最大值/最小值
egen wind_total=total(平均风速), by(province year) // 加总值: 缺失值视为0
egen wind_mean =mean(平均风速) , by(province year) // 平均值
egen wind_sd =sd(平均风速) , by(province year) // 标准差
egen wind_max =max(平均风速) , by(province year) // 最大值
egen wind_min =min(平均风速) , by(province year) // 最小值
** 3.4 合并地址信息
egen address1=concat(province city) // 无分隔符
egen address2=concat(province city), punct(" ") // 以空格为分隔符
egen address3=concat(province city), punct(,) // 以逗号为分隔符
** 3.5 分位数
egen wind_p50=median(平均风速), by(province year) // 中位数 (50%分位数)
egen wind_p30=pctile(平均风速), by(province year) p(30) // 30%分位数
** 3.6 数列
egen list=seq(),from(1) to(3) by(province year) // 生成1-3的数列
// 特殊用法: 生成1-100000的数列,可以保证每一类list取值为1的样本只有一个,可以查看样本的数量分布情况
egen list2=seq(), to(100000) by(province year)
** 3.7 行运算
egen wind_rtotal=rowtotal(平均气温 平均风速 累积降水 累积日照 平均湿度) // 加总值
egen wind_rmean =rowmean(平均气温 平均风速 累积降水 累积日照 平均湿度) // 平均值
egen wind_rsd =rowsd(平均气温 平均风速 累积降水 累积日照 平均湿度) // 标准差
egen wind_rmax =rowmax(平均气温 平均风速 累积降水 累积日照 平均湿度) // 最大值
egen wind_rmin =rowmin(平均气温 平均风速 累积降水 累积日照 平均湿度) // 最小值
** 3.8 erepalce 的使用
// ereplace可使用的函数与egen相同
ssc install ereplace, replace // 仅首次使用需要安装

******************************** 二、IF条件的使用 ********************************
/* 相关链接:
「Stata的IF条件用法」https://zhuanlan.zhihu.com/p/479001988
*/
/* gen type=1 if 累积降水!=. // 干旱=1: 不等号「!=」 */
gen type=1 if 累积降水>=0 & 累积降水<200
replace type=2 if 累积降水>=200 & 累积降水<400 // 半干旱=2: 「且」关系——「&」
replace type=3 if 累积降水>=400 & 累积降水<800 // 半湿润=3
replace type=4 if 累积降水>=800 & 累积降水!=. // 湿润=4
/* Stata 中,数值型变量的缺失值【.】被定义为无穷大 */
gen select=1 if type==2 | type==4 // 半干旱或湿润地区: 「或」关系——「|」
// 等价命令
replace type=4 if inrange(累积降水,800,9000000) // 等价湿润地区的区间: 两端取等号
replace select=1 if inlist(type,2,4) // 等价半干旱或湿润地区
gen region=1 if inlist(province,"上海市","浙江省","江苏省")
replace region=1 if strmatch(province,"*上海*") | strmatch(province,"*浙江*") | strmatch(province,"*江苏*") // 字符匹配——strmatch
replace region=1 if province=="山东省"

******************************** 三、变量管理(2) ********************************
/* 相关链接:
「Stata变量管理」https://zhuanlan.zhihu.com/p/479828341
*/
** 1. 重命名
webuse renamexmpl,clear // 打开 rename 的示范数据集
** 1.1 单个变量重命名
rename famid familycode
** 1.2 组变量重命名
rename (sex inc) (gender income)
gen Var1=.
gen Var2=.
rename Var# =new // 单个数字通配符 #
rename Var* V* // 任意字符通配符 *

** 2. 标签
** 2.1 查看标签
d gender // describe 简写
label dir // 查看值标签列表
label list sex // 查看值标签与数值对应关系
** 2.2 定义变量标签
{
label var gender "性别" // variable 简写
label var income "收入"
label var familycode "家庭编码"
}
// excel数据批量生成变量标签
** 2.3 数值标签
// 移除值标签
label drop sex // 数据层面: 移除数据的值标签
label values gender // 变量层面: 移除varlist的值标签
// 添加值标签
label define gender 1 "男" 2 "女", add // 定义值标签
label values gender gender

** 3. 排序
// 变量排序
order familycode gender
order promo, after(familycode)
order promo, before(gender)
order V*new, after(gender)
// 样本排序
sort familycode // 单变量
sort familycode gender
gsort + familycode gender // 等价命令
gsort - familycode + gender

** 4. 删除与保留
// 变量删除与保留
drop V*new
keep familycode edu gender income
// 样本删除与保留
keep if edu>0 // 保留edu取值是正数的样本
drop if familycode>100 // 删除家庭编码超过100的样本
// 删除重复样本
ereplace income=total(income), by(familycode)
duplicates drop familycode, force
// 导出数据
export excel "演示数据.xlsx",sheet("Sheet1") firstrow(var) replace