楼主: 小芝麻子
4756 9

[问答] 急!求助,如何删除不符合要求的观测值的整个公司数据 [推广有奖]

  • 1关注
  • 0粉丝

高中生

37%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
99 点
帖子
17
精华
0
在线时间
31 小时
注册时间
2014-5-6
最后登录
2014-5-23

楼主
小芝麻子 发表于 2014-5-7 04:20:40 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

有以下要求:1.删除ETR>1or ETR<0

2. 删除所得税费用为负的值

3.删除数据不全的公司

4.删除业绩亏损公司

一开始我是用ifdelete处理的,但是出来的结果只是删除了不符合要求的数据的列。如下:

data mylib.try1;

  set mylib.abc_copy;

  if etr>1or etr<0 thendelete;

  if Income_tax_expense<0  then delete;

  if net_profit <0 then delete;

  run;   

但我们老师要求的是比如a公司10年数据里有1年的etr>1,所以关于整个公司的10年的数据都删除掉

后来我参考了下面同学的贴子,用ETR>1or ETR<0试了,但是怎么弄也不行

https://bbs.pinggu.org/thread-777356-1-1.html

data mylib.y;                                                                                                                    set mylib.abc_mb_company_copy;                                                                                                     by stkcd;                                                                                                                         if first.stkcd and etr>1or etr<0 then output ;                                                                                     run;                                                                                                                               proc sql;                                                                                                                         select * from  mylib.abc_mb_company_copya                                                                                         where not exists                                                                                                                  (select * from mylib.y b where a.etr=b.etr);                                                                                       quit;(失败)

重复一下问题的重点:stkcd证券

1.删除ETR>1or ETR<0

2. 删除所得税费用为负的值 Income_tax_expense<0

3.删除数据不全的公司 如缺失值

4.删除业绩亏损公司net_profit <0

只要有任一条件不符合要求,删除该公司的所有信息

如   1中2002年etr>1所以 删除stkcd1所有年度的所有数据。其他删除要求也是这样处理。

stkcd   accper     etr        Income_tax_expense     net_profit     ...

1         2002     1.2              

1         2003     0.1

1         2004     0.5

1         2005     0.7

2         2002     0.8

2         2003     0.1

2         2004     0.5

2         2005     0.7


求求各位大神帮忙一下,在这里感激不尽了。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:观测值 如何

沙发
jeozu 发表于 2014-5-7 09:24:03
你的要求
3.删除数据不全的公司﹑ 如缺失值
不清楚,不知道你说的究竟是那些数据缺失就算符合条件。同时,也不知道你的数据表结构,所以只能无视。。
  1. proc sql noprint;
  2. create table xx as
  3. select * from mylib.try1 where stkcd not in(
  4. select distinct stkcd from mylib.try1 where ETR>1 OR ETR<0 OR income_tax_expense<0 OR net_profit<0 )
  5. ;
复制代码

藤椅
小芝麻子 发表于 2014-5-7 10:32:46
jeozu 发表于 2014-5-7 09:24
你的要求不清楚,不知道你说的究竟是那些数据缺失就算符合条件。同时,也不知道你的数据表结构,所以只能无 ...
比如说数据为空格没有内容或者是一个小点:
ETR第一个格子空了 或者是net_profit第一个格子是” . ”的情况。
If..delete句式是if net_value_of_inventory=. or net_value_of_inventory ="" then delete;
但是字段stkcd ﹑accper﹑etr﹑net_profit ﹑ year等有点多,有没有办法一次性处理在以上两个问题??
麻烦你了~大神~~谢谢
stkcd   accper       etr        net_profit        net_value_of_inventory
1         2002                          .                    300
1         2003       1.2              1                    500

板凳
larry_dh 发表于 2014-5-7 12:04:05
换个思路吧,我们先把 满足删除条件的公司ID删选出来, 变量stkcd是id吗????然后就好办了。
data mylib.try1(keep=id);                                                                                                               
array value{6} stkcd accper etr Income_tax_ expense net_profit;                                                                        
set mylib.abc_copy;                                                                                                                    
if etr>1or etr<0 then id=stkcd;                                                                                                        
elseif Income_tax_expense<0 then id=stkcd;                                                                                             
elseif net_profit <0 then id=stkcd;                                                                                                   
elseif do i=1 to 6;                                                                                                                    
           if value{i}=. then id=stkcd;                                                                                                
           break;                                                                                                                       
        end;                                                                                                                           
run;

说明一下:1) 我觉得应该用if elseif语句,因为一行数据只要满足一个条件,就可以了;
                 2)你说的数据不全,实在是耐人寻味啊,缺失值算是不全,要是那一年数据完全没有也算不全,代码里没体现;
                 3)本来,尽量不出现重复的公司ID,可后来一看  还是会出现重复的ID  毕竟多行数据在,这个代码页没体现;
                 3)我接触SAS 不到2个月,上诉代码也没测试过(数组元素个数 也意思意思搞了下),就是给个我的思路,希望对LZ有所帮助;

1.JPG (19.66 KB)

1.JPG

报纸
小芝麻子 发表于 2014-5-7 12:25:09
larry_dh 发表于 2014-5-7 12:04
换个思路吧,我们先把 满足删除条件的公司ID删选出来, 变量stkcd是id吗????然后就好办了。[/backcolor ...
嗯?我们老师在要求上原话是:剔除财务数据不全和注册地﹑名义税率信息缺失的公司。
网上看到缺失值不是空格和点吗?
如:if net_value_of_inventory=. or net_value_of_inventory =""
变量其实不只是6个,很多个~~~我会试试你的那个看看,运行出来如何。谢谢你的思路。^_^

地板
jeozu 发表于 2014-5-7 12:27:21
小芝麻子 发表于 2014-5-7 10:32
比如说数据为空格没有内容或者是一个小点:
ETR第一个格子空了 或者是net_profit第一个格子是” . ”的情 ...
如果重要的都是数据类型,那么可以删除,
  1. data _a;
  2. set mylib.try1;
  3. array _t[*] _numeric_;
  4. _tmp=0;
  5. do _i=1 to dim(_t);
  6.    _tmp=sum(missing(_t[_i]),  _tmp);
  7. end;
  8. if ETR>1 OR ETR<0 OR income_tax_expense<0 OR net_profit<0 OR _tmp>0;
  9. keep stkcd;
  10. run;
  11. proc sql noprint;
  12. create table final as
  13. select * from mylib.try1 where stkcd not in(select distinct stkcd from _ex);
  14. quit;
复制代码
这样的代码不稳健,适合分析,不适合生产。可以先proc contents后,使用使用功能比较好的编辑器如vi等把所有你需要的变量编辑出来。偷懒可以用好的编辑器来。
如果只有net_value_of_inventory和 net_value_of_inventory两个字段,
那么可以再上一个sql中改一下就可以了。
  1. proc sql noprint;
  2. create table xx as
  3. select * from mylib.try1 where stkcd not in(
  4. select distinct stkcd from mylib.try1 where ETR>1 OR ETR<0 OR income_tax_expense<0 OR net_profit<0 OR net_value_of_inventory=. OR net_value_of_inventory =""  )
  5. ;
复制代码

7
小芝麻子 发表于 2014-5-7 12:43:40
jeozu 发表于 2014-5-7 12:27
如果重要的都是数据类型,那么可以删除,这样的代码不稳健,适合分析,不适合生产。可以先proc contents后 ...
我用的数据是在学校从国泰安数据库下载下来的,大部分都是数据,因为后期要用stata进行分析。但也有部分是文字型的。
我想问一下,这条分析对于文字型的数据有没有影响还有数据类型的变量是不是要确定是Int不是Nom的形式,否则不起作用?
楼主智商捉急,你最后那句话意思是要把所有数据整理好,再用来分析,不然分析了再加新数据不稳定,是吧?谢谢你的热心帮忙。^_^

8
小芝麻子 发表于 2014-5-7 12:52:38
jeozu 发表于 2014-5-7 12:27
如果重要的都是数据类型,那么可以删除,这样的代码不稳健,适合分析,不适合生产。可以先proc contents后 ...
不只那两个字段~~有很多个呢~~所以用第一个代码比较好?第二个代码没有整个表解决掉的吗?
然后想顺便问一下有没有程序可以得知文中还有没有 " " 和 . 的值的数量?
真是太麻烦你了。> <

9
jeozu 发表于 2014-5-7 12:57:03
小芝麻子 发表于 2014-5-7 12:43
我用的数据是在学校从国泰安数据库下载下来的,大部分都是数据,因为后期要用stata进行分析。但也有部分是 ...
必须要分清楚字段类型是文字还是数字。当然,时间类型的表达方式也很重要。
如果是重复性工作,尽量一次性做得稳健一点,免得以后频繁维护。
如果你们有国泰安数据库的接口,可以使用sql client. 那么就以对方数据库为基准直接导入。。生产数据库的变动是相当少见的,所以一般后端的代码也就没有需要改动的地方。一次劳动,长久受益。。

10
小芝麻子 发表于 2014-5-7 13:18:57
jeozu 发表于 2014-5-7 12:57
必须要分清楚字段类型是文字还是数字。当然,时间类型的表达方式也很重要。
如果是重复性工作,尽量一次 ...
数据是供论文使用的,当时下载的时候用EXCEL2007下载,没看到sql client。所以后来都要一个一个改为Int形式。嗯,你说的问题,我会注意的。^^

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 05:10