Stata中的判断神器——confirm命令
本文作者:乔昕悦,香港大学经管学院
本文编辑:温和铭
技术总编:李婷婷
Stata&Python云端课程来啦!
为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于9月1日起调价,Python课程的价格调整为199.9元,Stata进阶课程调为199.9元,Stata基础课程调整到229.9元,Stata文本分析、正则表达式、网络爬虫、基本字符串课程调整至79.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦
confirm
命令一般用于编制program,主要用来验证命令后的信息是否存在、是否属于合规的类型,如果不是,则报错,显示相应的错误信息和非零返回值。
在实际应用中,confirm
命令经常和capture
命令配合使用。加上capture
后,该命令的执行结果不会显示,即使程序执行时出现错误,程序也会继续。capture
命令会生成一个返回值_rc
。若capture confirm
命令未出错,则_rc
值为0;若出错,则_rc
值为对应的错误代码。
接下来,让我们一起来看看confirm命令常用的几种使用方式吧~
一、判断字符串的存在
格式:
confirm existence string
confirm existence
可以用来判断其后面字符串的存在性,比如confirm existence this is something
用于确认字符串“this is something”是否存在。比如我们在编制一个命令,调用命令的时候需要判断是否传递了参数,这时候就可以用confirm existence判断对应参数位置是否有信息输入。试执行如下命令:clear all
confirm existence //报错
confirm existence this is something //不报错
local 1 "this is something" //把“this is something”放在1这个局部宏中
confirm existence `1' //不报错
confirm existence `0' //报错
简单说,confirm existence
就是为了判断它自己后面有没有跟一个字符串,这个字符串可能是调用program定义的一个命令的参数,往往通过local传递。在上边的程序中:使用clear all
清空内存后,第一个confirm existence
命令后面没有任何信息,所以直接报错。然后我们定义了一个local 1, 其内容为“this is something”,此时confirm existence
看到后面确实有字符串,因此confirm通过,不会报错。由于local 0尚未进行定义,我们执行confirm existence `0’的时候,被Stata翻译成confirm existence,所以报错。二、判断变量的存在和类型
格式:confirm[ new | numeric | string | str# | type ] variable varlist [, exact]
默认情况下,varlist中的变量可以是缩写,选项exact
表明变量必须完全匹配。
有时候由于变量较多,我们一时不能挨个查看数据中是否含有某个变量,这时我们可以通过
confirm variable
来判断变量是否存在和有效。下面我们编制一个程序,然后通过调用这个新命令检查变量是否存在:capture program drop check //如果内存中已经定义过名为check的命令,删除该命令
program check //编制新命令check
capture confirm variable `1' //判断通过宏传递的参数(变量)是否存在
disp _rc
if _rc==0 { //若不报错,_rc为0,证明变量存在
disp "`1' exists"
}
else { //反之,变量不存在
disp "`1' does not exists"
}
end
以Stata自带的auto数据为例,假如我们想调用check
命令验证一下变量weight和year是否存在,我们在上述程序的基础上键入如下命令(需要注意的是,这里使用程序定义语句编写的新命令check
,退出Stata或者删除上述程序后命令就不存在了):sysuse auto
check weight
check year
Stata读出的结果如下图所示,经过验证,我们发现weight变量存在,year变量不存在。
有时候我们会希望输入的变量是特定的类型(字符型or数值型or其他),这时我们加上括号中的内容用来判断,type可以是
{ byte | int | long | float | double | str# | strL }
。举例说明,
confirm numeric variable
用于判断变量是否是数值型的;confirm str# variable
用于判断是否变量都是str#格式的,比如str10或str42(这里不包括strL)。假如我们想要判断Stata自带的auto数据中变量make,mpg,weight,length和foreign的类型,命令如下:
clear all
sysuse auto
foreach v in make mpg weight length foreign { //运用foreach语句循环读入变量
capture confirm numeric variable `v' //capture和confirm结合,根据返回值判断变量的类型
disp _rc
if _rc==0 { //若命令未出错,变量为数值型,则_rc为0
disp "`v' is a numeric variable"
}
else { //若命令出错,_rc为错误的对应代码,这里是7
disp "`v' is a string variable"
}
Stata输出的结果如下图所示,我们可以看到除了make,其他变量都是数值型的:
我们也可以编制一个新命令来判断变量的类型,程序如下:
clear all
capture program drop vtype
program vtype
capture confirm str# variable `1'
disp _rc
if _rc { //if判断中认为0为假,不执行;非0为真,执行
disp "`1' is a numeric variable"
}
else {
disp "`1' is a string variable"
}
end
sysuse auto
vtype make
vtype mpg
在这个程序中,我们通过编制新命令vtype
来判断通过宏传递的参数(变量)的类型。程序运行后的结果如下图所示,我们可以得到,在auto数据中,变量make是字符型的,mpg是数值型的:
三、判断文件的存在
01判断文件存在且可读
格式:confirm file filename
在这里我们使用auto数据创建一个myauto.dta文件,并检验它的存在和可读性。程序如下:
clear all
cd d:\
!RMDIR d:\temp /s/q //调用命令删除目录;/s选项表示删除所有子文件夹和其中的文件; /q选项安静模式,即删除的时候不询问是否确认删除
mkdir d:/temp/ //创建目录
sysuse auto, clear
save d:/temp/myauto, replace
confirm file d:/temp/myauto.dta //确认myauto.dta存在且可读
格式:confirm new file filename
假如我们在上面的基础上想继续确认文件的不存在性,可以加入confirm new file
。
在这里如果我们检验myauto.dta这个文件,Stata就会报错,因为它已经在上述程序中被创建了,是存在的;但我们检验一个不存在的myauto1.dta文件时,Stata就会判断该文件不存在且可被创建。程序如下:
confirm new file d:/temp/myauto.dta //报错
confirm new file d:/temp/myauto1.dta //不报错
四、判断字符串的指定格式
格式:confirm [numeric | string | date] format string
confirm format
用来确认字符串是指定的格式。其中,numeric
选项要求后面待确认的内容是数值型的,包括general、fixed和exponential; string
选项要求是字符型的;date
要求是日期格式的。
clear all
*日期
confirm date format %d //不报错 %d是例如01oct2021的日期格式
confirm date format %dCY-N-D //不报错 %CY-N-D是例如2021-10-01的日期格式
*字符型
confirm string format %11s //不报错 %11s表示输出格式为占位11的字符型
confirm string format %11.4s //报错 没有这种格式
*数值型
confirm numeric format %011.4f //不报错 该格式总共占11位(包括小数点),小数点后四位,不足的位数用0补齐在前面
五、判断frame框架的存在和可创建性
格式:confirm [new] frame name
首先简单介绍一下frame
命令,这一命令允许内存中装入多个数据集,每个数据集被存入一个框架中。具体关于frame
命令的使用可以阅读我们公众号的《frame框架——我到底在哪个“房间”》等推文~
confirm frame
后跟框架的名称可以用来判断该框架是否存在,不存在时程序会报错;加入new
选项之后,confirm new frame
后跟框架名字用来确认该框架不存在,且该名称的框架可被创建。
我们可以通过如下例子展示该命令的使用:
frame reset //Stata恢复初始格式,清除内存中的所有框架
confirm frame default //不报错,default是内存中默认工作的框架
confirm frame myframe //报错,因为内存中没有myframe框架
confirm new frame myframe //不报错,myframe框架不存在且可被创建,该命名有效
六、判断命名是否符合规则
格式:confirm names names
这个命令可以用来确认后面所跟的命名是否是符合命名规则的、有效的命名。举个例子,我们键入如下命令:
confirm names ab.cd _abcd abcd @abcd
运行这个命令,程序会报错,并显示不合规则的命名内容:
七、判断参数是否可被解释为数字
格式:confirm [integer] number string
confirm number
可以用来验证参数是否能被解释为数字,比如1, 5.2, -5.2和2.5e+10都是可行的。加上integer
选项则指定后面的参数必须是整数。在下面的两个例子中,因为1.2和6001111分别可以判定为数字和整数,所以程序都不会报错。
confirm number 1.2
confirm integer number 6001111
今天关于confirm
命令的介绍就到这里,真的是干货满满!除了我们详细介绍的几种用法之外,confirm
命令还可以通过confirm matrix
和confirm scalar
来确认矩阵(matrix)和标量(scalar)的存在。大家有兴趣也可以了解一下!
腾讯课堂课程二维码
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
cngdf——名义GDP与实际GDP之间的摆渡船
最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……
随机森林-Random Forest
复原之神--preserve&restore
合并,“纵”享新丝滑:frameappend & xframeappend什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts
Stata助力疫情打卡管理——是谁没有接龙呢?
这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?【案例展示】Python与数据库交互
学好这一手,英语词典常在手玩转Stata中的数学函数
用spmap看中国空气质量戳穿围城面具:安利&劝退一个专业
走进图文并茂的攻略世界
玩转word文档“大变身”——wordconvert
简述递归
OpenCV库——轻松更换证件照背景色800万年薪!还有谁?!
千古伤心词人,词伤几何?
去哪儿网攻略爬取——跟我一起去大理吧
"有你才有团"——Stata爬取王者荣耀英雄海报
如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫
利用Python构建马科维茨有效边界
rangestat,让统计量灵活滚动起来!
听说这样做立项成功率更高哦
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为
作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。