数据清洗|变量生成与替换
一、gen 和 replace 用法
1. 基础用法
1 | ** 变量生成、数值替换 |
2. 常见运算函数
1 | ** 四则运算、对数、指数、幂运算 |
二、egen 和 ereplace 用法
2.1 基本语法
egen
可以实现许多无法通过 gen
命令计算的内容,其基本语法如下:
1 | egen [type] newvar = fcn(arguments) [if] [in] [, options] |
egen
命令中运算函数 fcn
运算对象
arguments
根据使用频率可以分为三类:1.
变量 (varlist);2. 表达式
(expression);3. 数列 (numlist)。
其中,变量运算可以分为对多个样本进行运算的单变量运算函数 (varname) 和对多个变量运算的多变量运算函数 (varlist) 。表达式运算函数可以对单个变量进行运算,相当于 \(1\times varname\) ,多变量运算函数也大多可以支持单变量运算。
by(varlist)
选项可以根据 varlist
对样本进行分组,在 egen
命令中,部分运算函数可以使用
by(varlist)
选项对样本进行分组,在每组内进行运算。
2.1.1 表达式运算函数
表达式运算是对不同样本的某个表达式计算值进行运算。所有表达式运算函数支持
by
选项。
"count"、"iqr"、"kurt"、"mad"、"max"、"min"、"mean"、"sd"、"mdev"、"median"、"pctile"、"pc"、rank、skew、std、"total"
2.1.2 单变量运算函数
单变量运算是对不同样本进行运算,仅有 mode
支持
by
选项。
"anyvalue"、cut、ends、mode
2.1.3 多变量运算函数
多变量运算是对不同变量进行运算,都不支持 by
选项。
"anycount"、"anymatch"、"concat"、diff、"group"、mtr、rowfirst、rowlast、"rowmax"、"rowmin"、"rowmean"、"rowsd"、"rowmiss"、"rownonmiss"、"rowmedian"、"rowpctile"、"rowtotal"、tag
2.1.4 数列运算函数
fill
不支持 by
选项,seq
支持 by
选项。
fill、"seq"
2.2 函数 function 和 选项 option
egen 命令的运算函数很多,此处忽略了部分不常用的用法。完整使用方法请参考 egen 的 HELP 文档。
2.2.1 变量值匹配:anycount、anymatch 和 anyvalue
这三个运算不能与 by 组合使用
基本语法:
1 | ** anycount: 变量列表varlist取值与整数列numlist取值匹配的变量个数 |
示例:
1 | ** anycount |
2.2.2 连接 / 合并变量:concat
该命令不能与 by
组合使用。按照 varlist
的顺序连接各变量,可以生成以下变量:
- 按照原样字符型变量;
- 在
format(%fmt)
选项下使用数字格式转换; - 在
decode
选项下解码。
基本语法:
1 | egen strvar = concat(varlist) [, format(%fmt) decode maxlength(#) punct(pchars)] |
maxlength(#)
表示控制最大标签长度
punct(pchars)
表示变量之间的分隔符号
示例:
1 | ** 按照x1、x3、x2的顺序连接变量 |
2.2.3 记数:count、rownonmiss 和 rowmiss
count
可以与 by
组合使用,rownonmiss
和 rowmiss
不能与
by
组合使用。
基本语法:
1 | ** count: 表达式exp计算结果不是缺失值的样本数 |
示例:
1 | ** count: 按照diqu分组,计算x1和x2乘积不是缺失值的样本数 |
2.2.4 分组 & 求和 & 占比:group、total、rowtotal、pc
total
可以与 by
组合使用,group
和 rowtotal
不能与
by
组合使用。
基础语法:
1 | ** group: 依据字符型/数值型取值分组,可以是字符型、数值型的组合 |
示例:
1 | ** group: 根据 county 生成分组变量 CID |
2.2.5 中位数 & 分位数与相关运算——median、pctile、mad、iqr、rowmedian、rowpctile
median
、pctile
、mad
和
iqr
可以与 by
组合使用,rowmedian
和 rowpctile
不能与 by
组合使用。
基本语法:
1 | ** median: 中位数 |
示例:
1 | ** pctile: 按省分组统计x1的20%分位数 |
2.2.6 样本均值、标准差、最值:sd、mean、min、max、mdev
该 5 个函数都可以与 by
组合使用。
1 | egen x1_sd = sd(x1) //x1 的标准差 |
2.2.7 多变量均值、标准差、最值:rowsd、rowmean、rowmin、rowmax
该 4 个函数都不能与 by
组合使用。
1 | egen xx_total = rowtotal(x1 x2 x3) //x1、x2、x3的加总值 |
2.2.8 数列——seq
该运算函数可以与 by
组合使用。
基础语法:
1 | egen newvar = seq() [, from(#) to(#) block(#)] |
示例:
1 | ** 每个数字计数一次,范围1~4,重复计数: 1,2,3,4, | 1,2,3,4, | 1,…… |
2.2.9 其他——kurt、
kurt
命令可以与 by
组合使用。
1 | ** kurt: 表达式exp的峰度 |