这个我也遇到了问题,并且考虑了一下午终于被我用了一个小聪明的做法解决了。可以看到我的数据,有些公司在某些年有ST,我的目标是,把有过ST的公司都删除,但是他们在其他年份又不是ST,那么怎么做呢?
我的代码如下 bys companyid: gen x = _N; drop if ST == 1; bye companied: gen y = _N; z = x - y; keep z == 0
我的思路是先通过companyid进行分组设置x,然后drop有ST过的数据,这样如果一个公司曾经有过ST,那么后面分组设置的y必定比x小,公司没有ST过,那么z = x-y必定等于0,因此我实现了不用合并数据就能把ST公司给剔除的操作,此处应有掌声......
可以看到我的数据,一个公司在某些年份有ST,但是没有ST时,ST == 1,那么怎么剔除这种公司呢?我运用了一点小聪明解决了这个问题。 我的代码: bys companyid: gen x = _N drop if ST == 1
bys companyid:gen y = _N
gen z = x - y
keep if z == 0
我的思路:首先对companyid进行分组,生成x变量,然后drop掉ST的数据,那么再次分组生成y变量的时候,如果一个公司ST过,那么他的y值必定比x小,因此z = x - y得到的是大于0的值。综上所述,z=0时,便是没有ST过的公司。
可以看到我的数据,一个公司在某些年份有ST,但是没有ST时,ST == 1,那么怎么剔除这种公司呢?我运用了一点小聪明解决了这个问题。 我的代码: bys companyid: gen x = _N
drop if ST == 1
bys companyid:gen y = _N
gen z = x - y
keep if z == 0
我的思路:首先对companyid进行分组,生成x变量,然后drop掉ST的数据,那么再次分组生成y变量的时候,如果一个公司ST过,那么他的y值必定比x小,因此z = x - y得到的是大于0的值。综上所述,z=0时,便是没有ST过的公司。
gen mis = strmatch(shortname,”*ST*”)|strmatch(shortname,”*PT*”) \\这个函数是关于字符串匹配的,会匹配出含有指定并赋值为1否则为0
drop if mis==1 \\以上的代码是删除一个企业中某些年份出现st,并把这些年份删除的代码。
bysort code:egen mist=sum(mis)
drop if mist != 0 \\该代码是删除哪怕只有有一年出现st的企业