查看原文
其他

egenmore隐藏功能——进制转换

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

本文作者:朱巧利

文字编辑:张馨月

技术总编:李朋冲


对于进制的概念相信大家并不陌生了,我们常用的进制有二进制、八进制、十进制与十六进制,在之前推文《万般进制千机变,Python一计定乾坤——利用Python来进行进制转换》中也有对进制的详细介绍,不太了解的小伙伴可以进行查阅。相信看了之前推文的读者,对于如何利用Python进行进制转换已经有了一定的了解,这时Stata的忠实爱好者可能会问了:利用Stata可以进行进制转换吗?回答是必须的!!!接下来小编将和大家分享一下Stata中进制转换的两个法宝,那就是egenmore命令中的base()函数与decimal()函数。

 

一、egenmore base()

 

Stata中输入的数据是十进制的,如果我们想把数据转成其它进制,就需要派出egenmore中的base()函数了。它的语法结构很简单:
base(varname) [ , base(#) ]
其中varname为我们需要转换进制变量的变量名,值得我们注意的是,base()函数的默认设置为二进制,接下来小编将用最简单的数据来做一下演示:
clearset obs 20gen v = _n //创建一个包含20个观测值的数据集egen binary = base(v) //binary为生成的二进制数据的变量名



可以看出利用base()函数十进制很容易就转换成了二进制,不过要注意此时生成的二进制数据为字符型而不是数值型。
如果我们想把十进制转为除二进制之外的其它进制,该怎么做呢?很简单!只需要在命令后加上[,base(#)]即可,具体命令如下:

egen four = base(v), base(4) //转为四进制egen six = base(v), base(6) //转为六进制egen eight = base(v), base(8) //转为八进制



这样就能轻轻松松地把十进制转为四进制、六进制与八进制。但是当我们查看egenmore的官方使用方法时,可以发现在base()函数下有这样一句话:


也就是说base()函数的默认设置是二进制并且最多只能转为九进制,这一点需要我们特别关注。

 

二、egenmore decimal()

 

egenmore中的decimal()函数与bae()函数是一对互逆的命令,可以把转成的二进制或其它进制再转换成十进制,其语法结构与base()函数相同,而且decimal()函数的默认设置也为二进制,也就是说它默认的是把二进制转为十进制。由于decimal是外部命令,使用前我们要先进行安装,命令为:
ssc install deci,replace
上面提到,通过base()函数转成的数据为字符型,如果直接使用decimal()进行转换,输入以下命令:
clearset obs 20gen v = _negen binary = base(v)egen deci = decimal(binary)
我们会看到Stata报错了:


所以我们要把字符型的数据先转为数值型才能利用decimal()函数,但是如果直接使用destring命令,会使数据失去二进制形式,转换成十进制时又会报错:


因此我们采用如下方法进行处理:首先,将原来二进制的数字串利用循环拆分成一个个单独的字符;接下来,再把单个字符再利用循环分别转为数值型;之后我们就可以利用decimal()函数来将转化好的单个数字转换成十进制的数字了。代码如下:
clear set obs 20gen v = _negen binary = base(v)*拆分数字串forvalues i = 1/5{ gen str1 code`i' = substr(binary,`i',1)}*依次将每个数字由字符型转为数值型forvaluesi = 1/5{ gen byte byte`i' = real(substr(binary,`i',1))}egen decim = decimal(byte1-byte5)



当然,如果原来的变量是数值型的二进制,就可以直接利用decimal()来进行转换了。如果想改变decimal()函数的默认二进制,与base()函数一样,只需在命令后加上[,base(#)]即可,中间的拆分过程同上述一样。例如把八进制转为十进制,命令为:

egen decim = decimal(q1-q8), base(8) //注意q1-q8是根据情况改变的

至此就把Stata中进制转换的两个法宝介绍完了,大家快快收下这个隐藏功能吧~



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

相遇insobs,如暗室逢灯

数据可视化之地理坐标系

SFI:Stata与Python的数据交互手册(一)
Stata模拟构建朋友圈
一个粉丝的疑惑—— local和scalar
新的一年,效率满满~(下)

自科基金项目信息爬取

rename group批量修改变量名

小命令,大不同——insobs插入新值

新的一年,效率满满~(上)

圆蛋快乐
BvD最后一弹——宏观数据宝典
一招搞定并购数据
多图“预警”(二)

您的圣诞礼物到了,请注意查收

BvD数据库介绍之Oriana

frlink:让连接更具“目的性”

关于我们

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

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


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

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