本文作者:周宏杰
文字编辑:朱巧利
写在前面:
在往期推文《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 1timer on 1fisid idcodetimer off 1timer list 1*isid命令timer clear 1timer on 1isid idcodetimer off 1timer list 1
结果如下图所示:


在本例中,使用fisid命令和isid命令对idcode变量进行检查,发现fisid和isid都将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 1timer on 1use test.dta,clearfsort u2timer off 1timer list 1*sort命令timer clear 1timer on 1use test.dta,clearsort u2timer off 1timer list 1*gsorttimer clear 1timer on 1use test.dta,cleargsort u2timer off 1timer list 1
结果如下所示:
|
|
|
|
|
|
|
|
|
|
从表中很明显看出,fsort命令处理速度快很多。
(5) 对比fsort命令、sort命令和gsort命令对非分类变量的处理速度
在Stata手册中,fsort命令的解释是对分类变量进行排序,那么fsort命令可以对非分类变量进行排序吗?运行速度如何?为了解答这个问题,可以做个小实验,继续用刚刚生成的test数据集,然后对变量u1进行排序。由于代码只需将fsort、sort、gsort命令的对象改成u1,所以这里就不再赘述了。直接展示运行结果:
|
|
|
|
|
|
|
|
|
|
可以发现fsort是可以对非分类变量进行排序的,但是处理速度却不尽人意,因此在大数据集中,还是使用sort或者gsort命令对非分类变量排序。
NBA球员薪资分析——基于随机森林算法(二)
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

