查看原文
其他

duplicates drop之前,我们要做什么?

数据分析团队 Stata and Python数据分析 2022-03-15

本文作者:俞诗琪

文字编辑:王碧琪

技术总编:李朋冲


在数据处理中,我们经常会遇到一个数据集中有多行重复观测值的情形。这不仅耗费更多的存储空间,还可能降低工作效率甚至是分析结果的准确性。通常而言,我们可以采用duplicates drop批量删除数据集中的这些重复项。

 

当然,对整个数据集删除重复观测值是最简单的情形,更为常见的,是对于几个变量的联合取值进行重复值的剔除。我们当然可以使用duplicates命令来完成这项工作,只是,所有的删除都不能贸然进行,对重复观测值进行审查,是非常有必要的。这个过程也会加深我们对于数据结构的了解,从而更好地为实证研究服务。在本文中,我们将会介绍,删除之前,我们需要做些什么。

 

首先,我们使用auto数据集,温习一下duplicates命令在删除重复项中的妙用。其基本语法如下:

 

duplicates drop [if] [in]

duplicates drop varlist [if] [in], force


当不加变量名时,表示对整个数据集进行剔重;反之,则表示仅对选定变量的取值进行剔重。其后跟的force选项,表示强力删除选定变量的重复项。

 

我们先用expand命令复制数据集前两行观测值,然后用duplicates drop对整个数据集进行剔重,程序及结果如下:

sysuse auto, clearexpand 21 in 1/2 //这样,前两行的观测值,将各有20个重复项duplicates drop

对整个数据集,删除了40条重复值,仅保留其第一次出现的观测值。

 

我们也可保留变量turn的前5行观测值,并使用duplicates drop命令删除其中的turn的重复值。程序及结果如下:

sysuse auto, clearkeep in 1/5list make turn

duplicates drop turn, force //只保留第一个重复值

list make turn

可知,前五行中,变量turn的两条重复值都被删除(对应品牌分别为:AMC Pacer”和“Buick Century”),仅保留第一个turn取值为40的观测值(对应品牌为:AMC Concord”)。

 

在此基础上,我们进一步展示duplicates命令在报告、列示及标记变量重复项方面的强大功能。

 

(1)报告重复项

 

duplicates命令可报告整个数据集或者特定变量的重复值个数情况。其基本语法如下:


duplicates report [varlist] [if] [in]


其中,varlist可表示为一个或多个变量名,若选取变量不止一个,则显示所选变量的联合取值情况;如果不加varlist,则表示查看整个数据集的重复值情况。

 

在本例中,我们以auto.dta中的变量trunkturn为例,报告其重复项情况。需注意的是,这里报告的是联合取值的重复项情况。程序和结果如下:

 

sysuse auto, clearduplicates report trunk turn

结果显示,出现一次(copies=1)的观测值有40条,表明数据集的74条观察值中,trunkturn的联合取值有40条是unique observations出现两次的观测值有22条,此时surplus11,表明存在11条重复值。依据每一行结果,也可推断出变量trunkturn55(40+11+4)个不同的联合取值。

 

(2)列示重复项

 

在上例中,我们已经知道观测值的重复情况,想要进一步了解是哪一行的哪个值重复,则可通过命令duplicates examples查看。它可以列示重复项的某一个具有代表性的观测值,并显示其所在行数及出现次数。该命令的基本语法如下:

 

duplicates examples [varlist] [if] [in] [, options]

 

这里依然对变量trunkturn进行分析,查看重复项的具体位置。程序和结果如下:

duplicates examples trunk turn 


其中,表头#代表出现次数,e.g.obs代表每组其中一个重复项所在行数。以表格第一行为例,变量trunkturn取值为838的组合出现两次,位于第45行。上表的结果与(1)中的结果也一一对应,即出现两次的有11组、出现3次有4组。

 

(3)标记重复项

 

更加直观地,我们可以采用duplicates tag命令,通过生成新变量的方式标记重复项与非重复项。其基本语法如下:

 

duplicates tag [varlist] [if] [in], generate(newvar)

 

其中,newvar为新产生的变量,用于定义所在行对应观测值的多余次数。

 

依然选取变量trunkturn进行分析,并生成新变量copy程序及部分结果如下:

duplicates tag trunk turn, gen(copy)list trunk turn copy

如上,变量copy显示了trunkturn联合取值的重复情况。其中,copy取值为0时表示不存在重复项,即该行观测值在整个数据集中仅出现一次;相应地,copy取值为1时表示重复一次,即该行观测值在整个数据集中出现两次。以此类推。

 

(4)常用选项

 

duplicates有一些比较实用的选项,可以更好地帮助我们在Stata结果窗口里查看重复值(比如,我们可以使用duplicates list列示重复观测值)。下面我们介绍几个主要选项:

compress压缩结果显示时的列宽

nocompress使用display格式报告结果,且不压缩列宽

fastnocompress选项作用类似,如果是大样本,程序运行时间上会有所缩短

string(#)报告结果中,字符串形式的变量值仅保留#个字符,默认值是10个字符

clean不显示分隔线

divider每一列都显示一道分隔线

separator可定义每几行显示一道分隔线,默认的是每5行显示一道分隔线

sepby(varlist)当变量varlist的值发生变化时,设置一道分隔线

nolabel显示具体的数值,而非值标签,比如foreign变量

 

同样,我们用auto数据集举例,保留变量make、price、mpg、rep78和foreign,并且复制数据集前两行观测值,帮助大家更好理解这些选项。程序及结果截图如下:

sysuse auto, clearkeep make price mpg rep78 foreignexpand 2 in 1/2duplicates list //正常显示列宽br

duplicates list, compress //压缩显示时的列宽,此处压缩表头为goup:和obs:的列br

duplicates list makebr

duplicates list make, str(5) //缩减字符串的显示长度至5个字符br

此外还有:

duplicates list, sepby(price) //依据目标变量price进行分隔,如果price的值发生变化,就设置一道分隔线br


由此可见,我们可以运用以上选项,使数据结果的列示更简洁、明了,另外还有fast、separator等选项,由于篇幅有限,这里不做赘述,大家有兴趣可以自己运用这些选项,体会它们在实际操作中的作用。

 

总体而言,这个命令用法很简单,功能也很实用,那么大家都掌握了吗?赶紧来试一试吧!


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

数据含义记不住?—— label“大神”来帮忙

实战演练-如何获取众筹项目的团队信息

Zipfile(一)

tabplot命令

Jupyter Notebook不为人知的秘密

字符串方法(三)

数据,我要“拷打”你

花式调用返回值 —— svret与storedresults
encode 和decode——带你探索编码与解码的世界
字符串方法(二)
如何快速生成分组变量?
用Stata实现数据标准化
字符串方法介绍
Stata16新功能之“框架”——frlink连接多个数据集(3)
Stata16新功能之“框架”——基础命令大合集(2)
三分钟教你读懂Python报错
解析XML文件
命令更新之reg2docx:将回归结果输出到word
命令更新之t2docx——报告分组均值t检验

关于我们

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

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

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

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