查看原文
其他

数据筛选理还乱,datacheck能诊断

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:俞诗琪

文字编辑:朱巧利

技术总编:张计宝

导读



在前期推文中,我们介绍了比较两个相似数据集的方法(详见《Stata版大家来找茬—cfout就够了),那么如何检查单个数据集内部信息呢?小编今天就带大家学习一个好用的新命令——datacheck命令。


一、温故知新


在学习datacheck命令前呢,我们一起来回顾一个系统自带命令——assert命令。这个命令想必对于大家来说不陌生,它可以帮助我们检验数据集中数据是否符合特定条件,下面用一个简单例子来说明:

clear allsysuse bplongdescribe



这里我们采用数据集bplong,它跟踪记录了120个病人两期血压值的数据。如上图所示,变量patientsexagegrpwhenbp分别记录了病人编号、性别、年龄区间、测量时期以及血压值。现在我们利用assert命令,检查数据集中是否有性别误填(即sex变量值非01)的情况:

assert sex == 0 | sex == 1



输出结果为空,说明数据集中sex变量值均符合“sex == 0 | sex == 1”条件,不存在sex变量值非0且非1的项。现在我们对数据集第2行稍加改动,再次检验:

replace sex = 3 in 2assert sex == 0 | sex == 1



结果显示r(9)的报错,240项观察值中有1项不符合要求。此时若要列出这一不合要求项,还要用到list命令。但当数据集较为复杂时,我们可直接使用datacheck命令一步搞定:

datacheck sex == 0 | sex == 1

看到这你一定会问,datacheck到底是个怎样的命令呢?别着急,接下来我们将详细了解datacheck命令的用法和优势!


二、datacheck命令的语法及常用选项

 

首先,datacheck是个外部命令,需要通过“ssc install datacheck”进行安装。使用该命令,可以检验不符合项的存在与否,并输出、标记不符合项的内容(或不符合项及其前/后一项内容),其基本语法如下:

datacheck true_or_false_condition [if condition] [in range] [ , by(byvarlist) message(string) varshow(varlist) previous next flag nolist list_options ]
datacheck命令后紧跟“true_or_false_condition”,即一个“是与非”的条件表达式,结果返回数据集中不符合该条件的项,若数据均符合条件则返回空,其基本选项如下:
1by(byvarlist)使返回结果按指定变量分类输出byvarlist为指定的分类变量名。
2message(string):显示返回结果的标题string为该结果标题。
3varshow(varlist)输出指定变量,隐藏其余变量,varlist为指定的变量名,默认输出所有变量。
4previous输出不符合要求项、该项(在原数据集中)的前一项观察值内容。
5next输出不符合要求项、该项(在原数据集中)的后一项观察值内容。
6flag自动生成新变量_contra,对于不符合要求项的_contra值为1,否则为0。变量_contra在下次运行datacheck时被自动删除。
7nolist不输出结果。

 

三、datacheck命令的用法示例

 

1、检验sex变量值是否误填

 

紧接上述筛选sex误填项的操作:

datacheck sex == 0 | sex == 1



筛选出一行不符合条件“sex == 0 | sex == 1”的观察值,其sex变量取值为“3”。此时未加选项“varshow”,默认输出所有变量。当然也可在选项varshow中指定patientsex变量,使结果更为精炼:

datacheck sex == 0 | sex == 1, varshow(patient sex)



如果需要多次使用datacheck命令,一次性输出多个筛查结果,或其他复杂的程序运行下,使用message选项设置各筛查结果的名称,能使结果更具可读性:

datacheck sex == 0 | sex == 1, message(Wrong sex)



如上所示,这里我们将输出内容命名为“Wrong sex”。有时,我们不仅需要查看不符合项的内容,还要观察其前一项数据,那么选项previous就可轻松解决:

datacheck sex == 0 | sex == 1, message(Wrong sex) previous



相应地,使用选项next可观察不符合项及其后一项的数据:

datacheck sex == 0 | sex == 1, message(Wrong sex) next



2、筛选重度高血压患者

 

使用datacheck命令筛选重度高血压(变量bp值大于180)患者:

datacheck bp <= 180, message(Severe high blood pressure)



按性别分组后得到结果:

sort sexdatacheck bp <= 180, by(sex) message(Severe high blood pressure)



使用datacheck命令的by选项前,必须先用sort命令按分类变量(这里是sex变量)排序,否则会报错。若想在数据集上直接标出重度高血压患者,可使用flag选项,生成新变量_contra

datacheck bp <= 180, message(Severe high blood pressure) fla



结果显示,符合“bp <= 180”条件的项,其_contra变量值为“0”,否则其_contra变量值为“1”,一目了然,进行后续操作时就十分方便啦!

 

简单地说,使用datacheck命令的目的,即筛选、输出、标记不符合项的内容(或不符合项及其前/后一项内容),其结果形式可控,且可读性强,能满足快速检验数据集数据的需求,赶紧拿小本本记下来吧!







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
如何用简单的手法绘制出不一样的海外疫情趋势图
matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()
今日头条海外疫情数据爬取
anythingtodate带你轻松处理日期
_variables介绍
查询12306车次信息
海外疫情仍严峻,劝君更在家中留
国外疫情怎么看?——实时新闻获真知

基于贝叶斯定理的算法——朴素贝叶斯分类

中国知网爬虫(CNKI) 批量下载PDF格式论文

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存