数据的转置—xpose&sxpose

2016-12-19 司海涛 爬虫俱乐部 爬虫俱乐部

哈 喽,诸君安。在我们进行数据处理时,经常需要对数据进行转置,但是不同的数据类型,转置命令也是不一样的。比如说有些数据集只包含数值型的数据,有些只包 括字符型的数据,当然更普遍的一个数据集中既有数值型数据,又有字符型数据。今天笔者就给大家一一介绍各类数据转置的方法。


数值型数据的转置

数值型数据的转置,通过xpose这个命令来实现,其语法结构为:


接下来,我们举一个例子:

clear

set more off

webuse xposexmpl

数据如下图:

这是一个3行4列的数据,转置之后会变成一个4行3列的数据。

输入转置命令:

xpose,clear

[注意:clear这个选项是必须的,是为了提醒你转置之后原始数据将不存在。]

这样数据就得到了转置。但是我们发现变量的名称消失了。如果你想保留原始数据中的变量名称,可以加上[varname]

命令如下:

xpose,clear varname


这样就保留了原始数据的变量名称,如果再进行一次转置,会出现什么结果呢?我们尝试一下:

xpose,clear


我们发现转置两次之后,又得到了原始数据。这就是varname选项的方便之处。

另外,我们还可以通过[format(%fmt)]选项,来设定数据的显示格式。

xpose, clear varname format(%6.2f)


这样,转置之后所有的数值均显示两位小数。这里,如果format后边不设置具体的数据显示格式,(即[format]),则转置后的数据的显示格式为原始数据中最大的数据显示格式。

我们知道,当运算精度要求很高的时候,需要将变量的存储类型设置成浮点型或双精度型,但是转置后的数据可能会改变数据的存储类型,这时候我们可以[promote]选项,保证转置后的数值精度。如果原始数据中有变量的存储类型是double,那么转置后的所有数值的存储类型都是double。总之,[promote]可以使转置后的数据存储类型为原始数据中精度最高的存储类型,以确保数值的精确度。

例如:

clear

set more off

sysuse sp500

keep in 1/15

des


我们发现原始数据中,最高精度的存储类型为double,然后我们对数据进行转置。

xpose,clear

des


我们发现转置后所有数值的存储类型变成了float。而原始数据中,volume的存储类型为double,这就降低了数值的精确度,我们在用[promote]选项进行转置。

xpose,clear promote

des


这样,转置后的数据的存储类型都变成了double,确保了转置后数据的精确性。


字符型数据的转置

我们在之前的推文中介绍过用subinfile整理新浪上市公司公告。用subinfile处理数据之后,导入到stata中,再用split把数据拆分成1行30列,每一列对应一个公告,包括公告的日期、内容以及网址。(subinfile可以大大简化爬虫程序,这里不再介绍,详情可查看往期推文--删繁就简三秋叶,subinfile似剪刀)这里,直接给出爬虫程序:

clear

set more off

cd d:/新浪上市公司公告

copy"http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletin.php?stockid=600900&Page=1"d:/新浪上市公司公告/temp.txt, replace

unicode encoding set gb18030

unicode translate temp.txt, transutf8

unicode erasebackups, badidea

subinfile temp.txt, index(<a target='_blank' href='/corp/view/vCB_AllBulletinDetail.php?stockid=) replace

subinfile temp.txt, from(</a><br>) to(;;) replace

subinfile temp.txt, from( <a target='_blank' href=') to(;) replace

subinfile temp.txt, from('>) to(;)replace

subinfile temp.txt, from(</ul>)replace

infix strL v 1-20000 using temp.txt, clear

split v, parse(;;)

drop v 

运行上述程序,可得到如下结果:

这是一个1行30列的数据,我们现在需要把其转变为1列30行,使每一行对应一个公告。很明显,这里我们需要对数据进行转置。如果用xpose进行转置,将出现错误!!

xpose,clear


我们看到,所有观察值转置之后都变为缺失值。这是因为xpose仅仅可以对数值型数据进行转置,而这里所有的观测值都是字符串,所以无法用xpose完成转置。我们可以利用sxpose完成对字符串的转置。

sxpose语法结构如下:


接下来用sxpose对数据进行转置,命令如下:

sxpose,clear


这样我们就完成了对字符串的转置。

上述的数据是一个纯字符串的数据,但是在我们处理数据的过程中,会遇到数据集中既有数值又有字符串,这种情况再用sxpose转置,要加一个force选项,其指定当遇到数值型数据时,继续进行转置,并把数值型数据强制性的变为字符型。

我们举一个例子:

clear

set more off

sysuse auto

keep make price weight foreign

keep in 1/10


这个数据中make所在列为字符串,而foreign所在列为带有数值标签的数值,我们现在用sxpose进行转置。

命令如下:

sxpose,clear force 


转置后的数据,第一行其实就是这个数据的变量名,我们可以通过以下程序,将第一行变为变量名:

export excel using d:\sxpose.xls

import excel using d:\sxpose.xls,clear firstrow 

destring, replace


在处理数据过程中,往往原始数据的第一列为转置后数据的变量名称。如果转置之后,不想让变量名出现在观测值中,这时候我们可以用[firstnames]选项,firstnames指定原始数据的第一列为转置后数据的变量名称。使用[firstnames]选项,原始数据的第一列将不会出现在转置之后的数据中。

sxpose,clear force firstnames destring  


可以看到,转置后的数据不包含原始数据的第一列。destring指定把字符型数据变为数值型。




接下来

关注空气质量

总的空气质量如下图


河南的朋友!!

河南的朋友!!

出门记着戴口罩!!!






以上就是今天给大家分享的内容就是这些了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~,点赞打赏随您心意,么么哒~

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

编辑 by   司海涛

 


往期推文推荐:

1.火锅和肥羊,啤酒和炸鸡,cnstockchinafin

2.天路——chinafincntrade命令

3.subinfile修改文件,滚蛋吧,繁琐的命令君!

4.分时数据,从此唾手可得

5.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

6.esttab功能挖掘:YesorNo

7.套路处理数据

8.厉害了,我stata

9.众里寻她千百度,synth命令来帮助!

10.I have a Stata, Ihave a python





关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

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


欢迎关注爬虫俱乐部



微信扫一扫
关注该公众号