查看原文
其他

Ftools命令组之fisid命令和fsort命令介绍

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

本文作者:周宏杰

文字编辑:朱巧利

技术总编:张计宝

写在前面:



在往期推文《ftools命令——畅游大数据时代的加速器》中,我们详细介绍了ftools的如何编写mata类型,展示了ftools在大数据集处理中的优势。在本篇推文中,我们将介绍ftools的另一个部分——封装好的ftools系列命令。在往期推文《ftools命令——畅游大数据时代的加速器》中已经介绍了如何安装ftools命令,这里可以直接使用封装好的命令。本文将介绍ftools系列命令中的fisid命令和fsort命令。


一、 fisid命令



语法:fisid varlist [if] [in][, missok]

fisid命令作为isid命令的升级版,用来判断某一变量是否是唯一识别符,即检查该变量中每一个值是否都是不同的。有时候数据集过大,未指定某一变量为主键时,且我们需要找到一个变量为主键时,我们就可以使用这个命令。


(1)      fisid命令检查race变量是否为唯一标识符

Stata自带的数据集nlsw88.dta的变量idcode和变量race使用fisid命令来展示fisid命令如何工作的,具体命令如下:

先对idcode变量使用fisid命令:

sysuse nlsw88,clearfisid idcode

结果如下所示:

然后对race变量使用fisid命令:

fisid race

结果如下所示:

比上述两个结果发现,对idcode变量使用fisid命令时,Stata未返回任何值,说明运行成功,idcode变量是唯一值标识符。而对race变量处理时,Stata报错,说明race变量不是唯一标识符。


(2)      展示missok选项效果

fisid命令有一个唯一选项missok,从字面看得出就是“miss ok”,也就是在使用fisid检查某变量时,允许该变量里面含有缺失值。接下来还是使用nlsw88.dta数据集展示missok选项的效果。首先,将idcode变量的第一个值改成缺失值,然后分别使用不带missok和带missok选项的fisid命令来运行。具体命令行如下所示:

tostring idcode,replace //数值型变量不能直接替换某个值,需要将数值变量转成字符串replace idcode="" in 1*不带missok选项fisid idcode*带missok选项fisid idcode, missok

结果如下所示:

对比看出,若变量中含有缺失值,不加missok选项会直接报错,而带上了missok选项的话,会忽略缺失值,并且把该变量判别为唯一值标识符。


(3)      展示fisid命令和isid命令速度差距。

具体命令行如下所示:

sysuse nlsw88,clear*fisid命令timer clear 1 timer on 1fisid idcodetimer off 1timer list 1
*isid命令timer clear 1 timer on 1isid idcodetimer off 1timer list 1

结果如下图所示:

在本例中,使用fisid命令和isid命令对idcode变量进行检查,发现fisidisid都将idcode变量判别为唯一标识符。不过fisid命令的运行速度是isid命令的三倍。

 二、fsort命令



fsort命令的语法:

fsort varlist [, verbose]

fsort命令的作用是对分类变量进行排序。在大数据集里面,fsort命令比较好地解决了sort命令和gsort命令的处理速度比较慢的问题。现在仍然对数据集nlsw88.dta使用fsort命令来展示其效果。


(1)      industry变量进行排序:

具体命令行如下所示:
sysuse nlsw88,clearfsort industryorder idcode industry

结果如下所示:


发现结果已经按照industry变量进行排序,而且在每个类别里面数据保持原始顺序不变,说明fsort命令排序是稳定的。

 

(2)      对多个变量进行排序:

具体命令行如下所示:
sysuse nlsw88,clearfsort industry occupation smsaorder industry occupation smsa

结果如下所示:

从图中发现,先按industry进行排序,然后在industry的各类中对occupation进行排序,最后在occupation的各类中对smsa排序。


(3)      展示选项verbose的效果

verbose选项是显示排序的具体信息。具体命令行如下所示:

sysuse nlsw88,clearfsort industry

结果如下所示:

从图中看出,该变量有2246个样本,13个类别,因此fsort命令还能用来查询变量的样本容量和类别数量。


(4)      对比fsort命令、sort命令和gsort命令对分类变量的处理速度

由于在小数据集中,三个命令的速度差不多,甚至fsort命令的效果不如其他两个命令。因此为了更好地展现fsort 的效果,使用runiform命令随机生成50000000个服从均匀分布的样本,然后将其分成4组并编号。对分组编号分别使用fsort命令、sort命令、gsort命令,具体命令如下所示:

clearset obs 50000000gen u1=runiform() gen u2=1 if u1<0.25replace u2=2 if 0.25<=u1 & u1<0.5replace u2=3 if 0.5<= u1 & u1< 0.75replace u2=4 if 0.75<=u1save test.dta,replace*fsort命令timer clear 1 timer on 1use test.dta,clearfsort u2timer off 1timer list 1*sort命令timer clear 1 timer on 1use test.dta,clearsort u2timer off 1timer list 1*gsorttimer clear 1 timer on 1use test.dta,cleargsort u2timer off 1timer list 1

结果如下所示:


fsort命令
sort命令
gsort命令
运行时间/秒
29.372
36.525
36.143

从表中很明显看出,fsort命令处理速度快很多。


(5)      对比fsort命令、sort命令和gsort命令对非分类变量的处理速度

Stata手册中,fsort命令的解释是对分类变量进行排序,那么fsort命令可以对非分类变量进行排序吗?运行速度如何?为了解答这个问题,可以做个小实验,继续用刚刚生成的test数据集,然后对变量u1进行排序。由于代码只需将fsortsortgsort命令的对象改成u1,所以这里就不再赘述了。直接展示运行结果:


fsort命令
sort命令
gsort命令
运行时间/秒
89.300
87.565
84.884

可以发现fsort是可以对非分类变量进行排序的,但是处理速度却不尽人意,因此在大数据集中,还是使用sort或者gsort命令对非分类变量排序。

 

本文介绍了ftools系列命令在大数据集中的两个实用的封装命令——fisid命令和fsort命令,相信大家对于它俩的用途有了一定的认识,赶快行动起来更新以前的命令吧!后续还会推出ftools系列命令,大家敬请期待。





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

“抽丝剥茧”,层层下分——机器学习基本算法之决策树

爬取东方财富网当日股票交易情况

stata调用python爬取时间数据——借他山之石以攻玉

全国31省GDP排行强势登场!
接力《发哨子的人》Stata版
批量实现WORD转PDF

Stata有问必答环节

我听到了企业的哀鸣
“物以类聚”、“近朱者赤”——机器学习初探之KNN
SFI:Stata与Python的数据交互手册(二)

从流调数据中寻找感染真相

熟悉又陌生的reshape

NBA球员薪资分析——基于随机森林算法(二)

NBA球员薪资分析——基于随机森林算法(一)

高亮输出之唐诗作者

湖北省各市疫情数据爬取

古代诗人总去的这些地方你一定要知道!

DataFrame数组常用方法(二)

关于我们



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

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


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

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