有问必答 | 数据筛选

2017-01-17 强宇曦 爬虫俱乐部 爬虫俱乐部

某天,雾霾很重,爬虫君收到一封来信:


爬虫君您好:     

我现在遇到一个stata数据处理的问题是这样的:

      DUAL是一个0-1哑变量,现在我需要将全样本筛选出以下四个子样本,分别是DUAL一直为1的样本公司、DUAL一直为0的样本公司、DUAL先为1 后为0且中途只变化过一次的公司、DUAL先为0后为1且中途只变化过一次的公司,我可以分出DUAL一直为1的样本公司和DUAL一直为0的样本公司, 但是另外两个样本搞了很久都无法准确地筛选出来,希望爬虫君能指导一下,万分感谢!

     祝好!



一、审题

关于这道题,我们先看哈数据是什么样的。

再来审哈题:我们要找出四种样本,分别是DUAL一直为0,或一直为1,或0变为1且只变过一次,或1变为0且只变过一次。


二、答题思路

集才华与美貌并存的爬虫君的解题思路是:

对于DUAL一直为0或1的样本,我们可以对每个id的DUAL求和,和为0则表明DUAL一直为0,和等于每个id的观测值个数则表明DUAL一直为1。

对于DUAL0变为1且只变过一次,或1变为0且只变过一次的样本,我们可以对每个id,将后一个DUAL的观测值与前一个DUAL[_n]比较,如果一直相等则没有经过变换,如果不等则经过了变换,我们要找出只变换了一次的数据,之后再根据0、1划分细致分类。


三、详细解答

1、筛选DUAL一直为0或1的样本

sort id year

bysort id: egen total = sum(DUAL)  // 对每个id的DUAL求和

gen allzero = (total == 0)  // allzero=1表示DUAL一直为0的样本公司

bysort id: gen allone = (total == _N)  // allone=1表示DUAL一直为1的样本公司


2、筛选剩余样本

首先考虑变换次数。

生 成一个新的变量change表示是否进行了变换。对于每一个id而言,如果后一个DUAL观测值DUAL[_n - 1]等于前一个DUAL,则change = 0,没有进行变换;如果不等,则change = 1,表明经过一次变换。之后再对change求和计算变换次数

需要注意的是,由于每个id的第一个DUAL[_n - 1]值是缺失值,不等于DUAL[1],但也不表示进行了变换,所以我们要让其change = 0。

bysort id: gen change = (DUAL != DUAL[_n - 1] & DUAL[_n - 1] != .)

bysort id: egen changenum = sum(change) //变换的次数,changenum为1说明只发生了一次变化

然后考虑先0后1还是先1后0:

bysort id: gen startnum = DUAL[1]      //生成变量startnum等于一开始的数字。若startnum为0,且changenum为1,说明该公司先为0后为1,只发生一次变化

gen zero_one = (startnum == 0 & changenum == 1)       // zero_one = 1表示DUAL先为0后为1且中途只变化过一次的公司

gen one_zero = (startnum == 1 & changenum == 1)      // one_zero = 1表示DUAL先为1后为0且中途只变化过一次的公司

drop total change changenum startnum 

此时,我们就得到了想要的结果!

当然筛选DUAL一直为0或1也可以写成:

gen allzero = (startnum == 0 & changenum == 0) 

gen allone = (startnum == 1 & changenum == 0)

以上就是爬虫君的答题思路与详细解答,谢谢~





完整程序:

clear

set more off

use "数据.dta"


sort id year

bysort id: egen total = sum(DUAL)

gen allzero = (total == 0)

bysort id: gen allone = (total == _N)

bysort id: gen change = (DUAL != DUAL[_n - 1] & DUAL[_n - 1] != .)

bysort id: egen changenum = sum(change)

bysort id: gen startnum = DUAL[1]

gen zero_one = (startnum == 0 & changenum == 1)

gen one_zero = (startnum == 1 & changenum == 1)

drop total change changenum startnum



接下来报告空气质量

全国空气质量如下


山西的朋友请注意

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

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

编辑 by梅洁瓷傲



往期推文推荐:

1.独家Stata技术培训,千呼万唤始出来

2.关于RTF你不知道的命令

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.玩转stata之调用浏览器

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word



关于我们

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

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

投稿邮箱:xueyuan19920310@163.com

投稿要求:

1)必须原创,禁止抄袭;

2)必须准确,详细,有例子,有截图;

注意事项:

1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。

3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


欢迎关注爬虫俱乐部


微信扫一扫
关注该公众号