温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 张静瑶(浙江海洋大学)
邮箱: 1132358871@qq.com
[编者按]: 本文内容摘译自以下文章,特此致谢!
[Source]: Klein D. Extensions to the label commands[J]. The Stata Journal, 2019, 19(4): 867-882. -Link-
目录
通常,我们会使用 label
命令给变量加标签,但在使用过程中也会遇到诸多不便,如:
鉴于 label
命令使用过程中的问题,本文将为大家介绍功能强大的 elabel
命令。
elabel
命令安装
*-安装命令
ssc install elabel, replace
语法
elabel subcommand [elblnamelist] [mappings] [iff eexp] [, options]
subcommand
为子命令,其与 label
子命令相同;elblnamelist
为值标签名列表,可以包含通配符;mappings
为值-标签具体映射关系,可以使用表达式;iff eexp
为条件表达式。
查看数据集「auto」中值标签「origin」内容,可以通过 list
子命令,具体如下:
*-列出值标签内容
sysuse auto, clear
elabel list origin
origin:
0 Domestic
1 Foreign
上述结果与 label
命令结果相同,但 elabel
更为强大的功能是其可以使用通配符,具体如下:
*-通配符使用
label list ori~ //无法使用通配符
value label ori not found
r(111);
elabel list ori~ //可以使用通配符
origin:
0 Domestic
1 Foreign
当然,我们也可以使用通配符引用多个值标签。
有时,我们会忘记值标签名称,但知道值标签具体内容,也可以通过 elabel
命令列示,具体如下:
*-通过标签列出值标签内容
elabel list (foreign)
origin:
0 Domestic
1 Foreign
列出满足「整数」条件的值标签内容:
*-列出满足条件的值标签内容
elabel list origin iff (# > 0) //#整数占位符
origin:
1 Foreign
列出满足「文本」条件的值标签内容:
elabel list origin iff strpos(@, "D") //@字符占位符
origin:
0 Domestic
其中,# 字符充当源中的整数值占位符,@ 字符充当源中的文本占位符。 strpos()
函数是一个任意的选择,也可以选择 strmatch()
,只要 iff
后面的表达式为 “真” 或 “假” 即可。
上述几个简单事例主要介绍如何列示值标签,接下来,我们将介绍如何定义和修改值标签。
在使用 elabel
命令时,我们可以将「整数值」对应到它们的任意函数,具体如下:
*-定义值标签
elabel define logs (1/4) (= strofreal(10^#))
elabel define time (0(60)240) (= strofreal(cond(#, #/60, 12)) + "am")
elabel list logs time
logs:
1 10
2 100
3 1000
4 10000
time:
0 12am
60 1am
120 2am
180 3am
240 4am
这里之所以使用 strofreal
函数,是因为值标签映射关系需要值的标签为字符形式。# 为整数占位符,关于 cond
函数可通过 help cond
查看详细帮助文档。
关于「吸烟频率」的值标签,映射关系如下:
*-系统改值标签
elabel define smoke ///
1 "never" ///
2 "once a week or less" ///
3 "every few days" ///
4 "most days" ///
5 "every day"
elabel list smoke
smoke:
1 never
2 once a week or less
3 every few days
4 most days
5 every day
现在,我们想让值标签的数值依次减 1,具体如下:
elabel define smoke (= #-1) (= @), replace //标签值减1
elabel list smoke
smoke:
0 never
1 once a week or less
2 every few days
3 most days
4 every day
继续引用上述「吸烟频率」例子,现在,我们想让「数值-标签」对应关系反转,即「0 - every day」,并以此类推。
*-标签-值关系反转
elabel recode smoke (0/4 = 4/0), define(smoke2) dryru
smoke:
0 never
1 once a week or less
2 every few days
3 most days
4 every day
smoke2:
0 every day
1 most days
2 every few days
3 once a week or less
4 never
这里,define()
选项为定义新的值标签 smoke2,而不是替换原有值标签 smoke。同时,也因为 dryrun
选项,这里值标签 smoke2 并没有产生,类似于「暂元」,若要生成 smoke2,只需去掉 dryrun
选项。
label
命令不能直接修改值标签名称,但可通过以下几步实现:
elabel
命令则可以通过 rename
子命令快速实现上述过程,比如,我们想将「nlsw88」数据中变量 married 和 collgrad 对应的值标签 marlbl 和 gradlbl 中 lbl 替换为 VL,具体如下:
*-批量修改值标签名称
sysuse nlsw88, clear
des married collgrad
storage display value
variable name type format label variable label
----------------------------------------------------------------
married byte %8.0g marlbl married
collgrad byte %16.0g gradlbl college graduate
elabel rename (*lbl) (*VL)
des married collgrad
storage display value
variable name type format label variable label
----------------------------------------------------------------
married byte %8.0g marVL married
collgrad byte %16.0g gradVL college graduate
仍以「nlsw88」数据为例,现在,我们想让变量 collgrad 的标签 college graduate 首字母大写,具体如下:
*-变量标签首字母大写
elabel variable (collgrad) (= strproper(@))
des collgrad
storage display value
variable name type format label variable label
----------------------------------------------------------------
collgrad byte %16.0g gradVL College Graduate
关于 strproper()
详细介绍请通过 help strproper
命令查看帮助文档。这里还需要强调,变量标签和值标签不一样。
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD