duplicates drop之前,我们要做什么?
本文作者:俞诗琪
文字编辑:王碧琪
技术总编:李朋冲
在数据处理中,我们经常会遇到一个数据集中有多行重复观测值的情形。这不仅耗费更多的存储空间,还可能降低工作效率甚至是分析结果的准确性。通常而言,我们可以采用duplicates drop批量删除数据集中的这些重复项。
当然,对整个数据集删除重复观测值是最简单的情形,更为常见的,是对于几个变量的联合取值进行重复值的剔除。我们当然可以使用duplicates命令来完成这项工作,只是,所有的删除都不能贸然进行,对重复观测值进行审查,是非常有必要的。这个过程也会加深我们对于数据结构的了解,从而更好地为实证研究服务。在本文中,我们将会介绍,删除之前,我们需要做些什么。
首先,我们使用auto数据集,温习一下duplicates命令在删除重复项中的妙用。其基本语法如下:
duplicates drop [if] [in]
duplicates drop varlist [if] [in], force
当不加变量名时,表示对整个数据集进行剔重;反之,则表示仅对选定变量的取值进行剔重。其后跟的force选项,表示强力删除选定变量的重复项。
我们先用expand命令复制数据集前两行观测值,然后用duplicates drop对整个数据集进行剔重,程序及结果如下:
sysuse auto, clear
expand 21 in 1/2 //这样,前两行的观测值,将各有20个重复项
duplicates drop
对整个数据集,删除了40条重复值,仅保留其第一次出现的观测值。
我们也可保留变量turn的前5行观测值,并使用duplicates drop命令删除其中的turn的重复值。程序及结果如下:
sysuse auto, clear
keep in 1/5
list make turn
duplicates drop turn, force //只保留第一个重复值
list make turn
可知,前五行中,变量turn的两条重复值都被删除(对应品牌分别为:“AMC Pacer”和“Buick Century”),仅保留第一个turn取值为40的观测值(对应品牌为:“AMC Concord”)。
在此基础上,我们进一步展示duplicates命令在报告、列示及标记变量重复项方面的强大功能。
duplicates命令可报告整个数据集或者特定变量的重复值个数情况。其基本语法如下:
duplicates report [varlist] [if] [in]
其中,varlist可表示为一个或多个变量名,若选取变量不止一个,则显示所选变量的联合取值情况;如果不加varlist,则表示查看整个数据集的重复值情况。
在本例中,我们以auto.dta中的变量trunk和turn为例,报告其重复项情况。需注意的是,这里报告的是联合取值的重复项情况。程序和结果如下:
sysuse auto, clear
duplicates report trunk turn
结果显示,出现一次(copies=1)的观测值有40条,表明数据集的74条观察值中,trunk和turn的联合取值有40条是unique observations;出现两次的观测值有22条,此时surplus为11,表明存在11条重复值。依据每一行结果,也可推断出变量trunk和turn有55(40+11+4)个不同的联合取值。
在上例中,我们已经知道观测值的重复情况,想要进一步了解是哪一行的哪个值重复,则可通过命令duplicates examples查看。它可以列示重复项的某一个具有代表性的观测值,并显示其所在行数及出现次数。该命令的基本语法如下:
duplicates examples [varlist] [if] [in] [, options]
这里依然对变量trunk和turn进行分析,查看重复项的具体位置。程序和结果如下:
duplicates examples trunk turn
其中,表头#代表出现次数,e.g.obs代表每组其中一个重复项所在行数。以表格第一行为例,变量trunk和turn取值为8和38的组合出现两次,位于第45行。上表的结果与(1)中的结果也一一对应,即出现两次的有11组、出现3次有4组。
更加直观地,我们可以采用duplicates tag命令,通过生成新变量的方式标记重复项与非重复项。其基本语法如下:
duplicates tag [varlist] [if] [in], generate(newvar)
其中,newvar为新产生的变量,用于定义所在行对应观测值的多余次数。
依然选取变量trunk和turn进行分析,并生成新变量copy。程序及部分结果如下:
duplicates tag trunk turn, gen(copy)
list trunk turn copy
如上,变量copy显示了trunk和turn联合取值的重复情况。其中,copy取值为0时表示不存在重复项,即该行观测值在整个数据集中仅出现一次;相应地,copy取值为1时表示重复一次,即该行观测值在整个数据集中出现两次。以此类推。
duplicates有一些比较实用的选项,可以更好地帮助我们在Stata结果窗口里查看重复值(比如,我们可以使用duplicates list列示重复观测值)。下面我们介绍几个主要选项:
compress:压缩结果显示时的列宽
nocompress:使用display格式报告结果,且不压缩列宽
fast:与nocompress选项作用类似,如果是大样本,程序运行时间上会有所缩短
string(#):报告结果中,字符串形式的变量值仅保留#个字符,默认值是10个字符
clean:不显示分隔线
divider:每一列都显示一道分隔线
separator:可定义每几行显示一道分隔线,默认的是每5行显示一道分隔线
sepby(varlist):当变量varlist的值发生变化时,设置一道分隔线
nolabel:显示具体的数值,而非值标签,比如foreign变量
同样,我们用auto数据集举例,保留变量make、price、mpg、rep78和foreign,并且复制数据集前两行观测值,帮助大家更好理解这些选项。程序及结果截图如下:
br
br
br
br
此外还有:
br
由此可见,我们可以运用以上选项,使数据结果的列示更简洁、明了,另外还有fast、separator等选项,由于篇幅有限,这里不做赘述,大家有兴趣可以自己运用这些选项,体会它们在实际操作中的作用。
总体而言,这个命令用法很简单,功能也很实用,那么大家都掌握了吗?赶紧来试一试吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。