Ftools命令组之fisid命令和fsort命令介绍
本文作者:周宏杰
文字编辑:朱巧利
写在前面:
在往期推文《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,clear
fisid 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 1
fisid idcode
timer off 1
timer list 1
*isid命令
timer clear 1
timer on 1
isid idcode
timer off 1
timer 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,clear
fsort industry
order idcode industry
结果如下所示:
发现结果已经按照industry变量进行排序,而且在每个类别里面数据保持原始顺序不变,说明fsort命令排序是稳定的。
(2) 对多个变量进行排序:
sysuse nlsw88,clear
fsort industry occupation smsa
order industry occupation smsa
结果如下所示:
从图中发现,先按industry进行排序,然后在industry的各类中对occupation进行排序,最后在occupation的各类中对smsa排序。
(3) 展示选项verbose的效果
verbose选项是显示排序的具体信息。具体命令行如下所示:
sysuse nlsw88,clear
fsort industry
结果如下所示:
从图中看出,该变量有2246个样本,13个类别,因此fsort命令还能用来查询变量的样本容量和类别数量。
(4) 对比fsort命令、sort命令和gsort命令对分类变量的处理速度
由于在小数据集中,三个命令的速度差不多,甚至fsort命令的效果不如其他两个命令。因此为了更好地展现fsort 的效果,使用runiform命令随机生成50000000个服从均匀分布的样本,然后将其分成4组并编号。对分组编号分别使用fsort命令、sort命令、gsort命令,具体命令如下所示:
clear
set obs 50000000
gen u1=runiform()
gen u2=1 if u1<0.25
replace u2=2 if 0.25<=u1 & u1<0.5
replace u2=3 if 0.5<= u1 & u1< 0.75
replace u2=4 if 0.75<=u1
save test.dta,replace
*fsort命令
timer clear 1
timer on 1
use test.dta,clear
fsort u2
timer off 1
timer list 1
*sort命令
timer clear 1
timer on 1
use test.dta,clear
sort u2
timer off 1
timer list 1
*gsort
timer clear 1
timer on 1
use test.dta,clear
gsort u2
timer off 1
timer list 1
结果如下所示:
从表中很明显看出,fsort命令处理速度快很多。
(5) 对比fsort命令、sort命令和gsort命令对非分类变量的处理速度
在Stata手册中,fsort命令的解释是对分类变量进行排序,那么fsort命令可以对非分类变量进行排序吗?运行速度如何?为了解答这个问题,可以做个小实验,继续用刚刚生成的test数据集,然后对变量u1进行排序。由于代码只需将fsort、sort、gsort命令的对象改成u1,所以这里就不再赘述了。直接展示运行结果:
可以发现fsort是可以对非分类变量进行排序的,但是处理速度却不尽人意,因此在大数据集中,还是使用sort或者gsort命令对非分类变量排序。
NBA球员薪资分析——基于随机森林算法(二)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。