楼主: ciciwanghk
5064 6

[原创博文] 删除缺失较多的变量名 [推广有奖]

  • 0关注
  • 0粉丝

博士生

13%

还不是VIP/贵宾

-

威望
0
论坛币
75 个
通用积分
1.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2914 点
帖子
97
精华
0
在线时间
289 小时
注册时间
2009-7-15
最后登录
2022-4-30

楼主
ciciwanghk 发表于 2011-1-20 09:40:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
删除缺失较多的变量名而不是记录,是删除列data a;
input x1 x2 x3;
infile datalines dsd dlm=',';
cards;
3, ,   
3 ,3 ,
23,, 435
1,2 ,
;
run;

明显x3缺失值最多,怎样把x3删除;我的实际变量有100多个
谢谢
二维码

扫码加我 拉你入群

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

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

关键词:infile cards Input Lines Data 记录

回帖推荐

elek.me 发表于4楼  查看完整内容

假定你的数据里全部都是数值型:

本帖被以下文库推荐

沙发
elek.me 发表于 2011-1-20 10:33:22
你这个缺失值较多,这个多,是怎么定义?
不够明确的话,不好写程序。
缺失值多的话,无非就是用drop语句或者dataset options
就是在查找缺失的时候需要判断
我的博客: http://elek.me/sas
联系我: http://about.me/elek

藤椅
ciciwanghk 发表于 2011-1-20 10:42:37
elek.me 发表于 2011-1-20 10:33
你这个缺失值较多,这个多,是怎么定义?
不够明确的话,不好写程序。
缺失值多的话,无非就是用drop语句或者dataset options
就是在查找缺失的时候需要判断
假如说是缺失值在20%以上的变量,用drop怎么写啊 ,能给出具体程序么

板凳
elek.me 发表于 2011-1-20 10:53:59
假定你的数据里全部都是数值型:
  1. data a;
  2.         input x1 x2 x3;
  3.         infile datalines dsd dlm=',';
  4. cards;
  5. 3, ,   
  6. 3 ,3 ,
  7. 23,, 435
  8. 1,2 ,
  9. ;
  10. run;

  11. ods listing close;
  12. proc means data=a;
  13.         var _numeric_;
  14.         output out=tmp(drop=_type_) nmiss=/autoname;
  15. run;
  16. ods listing;

  17. data _null_;
  18.         set tmp;
  19.         array freq[*] _numeric_;
  20.         length vars $ 32767;
  21.         do i=2 to dim(freq);
  22.                 if freq[i]/_freq_>0.2 then vars=catx(" ",strip(vars),scan(vname(freq[i]),1,"_"));
  23.         end;
  24.         call execute ('data want;set a;drop '||strip(vars)||';run;');
  25. run;
复制代码
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
crackman + 20 + 1 观点有启发
soporaeternus + 1 + 1 + 1 好的意见建议
ciciwanghk + 1 精彩帖子

总评分: 论坛币 + 20  学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

我的博客: http://elek.me/sas
联系我: http://about.me/elek

报纸
elek.me 发表于 2011-1-20 12:59:41
楼主发数据给我了,最终程序:
  1. ods listing close;
  2. proc means data=tmp1.tb_object_1853(drop=_character_);
  3.         var _numeric_;
  4.         output out=tmp(drop=_type_) nmiss=/autoname;
  5. run;
  6. ods listing;

  7. data _null_;
  8.         set tmp;
  9.         array freq[*] _numeric_;
  10.         length vars $ 32767;
  11.         do i=2 to dim(freq);
  12.                 if freq[i]/_freq_>0.2 then vars=catx(" ",strip(vars),tranwrd(vname(freq[i]),"_NMiss",""));
  13.         end;
  14.         call execute ('data want;set tmp1.tb_object_1853;drop '||strip(vars)||';run;');
  15. run;
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 收起 理由
论坛数据分析 + 3 观点有启发
crackman + 20 + 20 + 1 + 2 观点有启发

总评分: 经验 + 20  论坛币 + 20  学术水平 + 4  热心指数 + 2   查看全部评分

我的博客: http://elek.me/sas
联系我: http://about.me/elek

地板
baoaibaobao 发表于 2011-1-20 19:06:59
这是版主书里的代码,目的是要删除缺失值比例大于等于50%的变量,包括数值型和字符型变量。大家可以学习一下数组的应用。不过,我觉得更重要的是学习思路。
  1. data a;
  2. input x1 x2 x3 s1$ s2$ s3$;
  3. infile datalines dsd dlm=',';
  4. cards;
  5. 3, , ,a,,c   
  6. 3 ,3 ,,a,b,c
  7. 23,, 435,a,,,
  8. 1,2 ,,,b,
  9. ;
  10. run;
  11. data b;
  12.         set a nobs=obs;
  13.         array num _numeric_;
  14.         array chara _character_;
  15.         call symput('num',dim(num));
  16.         call symput('chara',dim(chara));
  17.         call symput('obs',obs);
  18. run;
  19. %put &num &chara &obs;
  20. data c;
  21.         set a end=last;
  22.         array num _numeric_;
  23.         array chara _character_;
  24.         array nummiss(&num) (&num*0);
  25.         array charamiss(&chara) (&chara*0);
  26.         length list $40.;
  27.         do i=1 to dim(num);
  28.                 if num(i)=. then nummiss(i)+1;
  29.         end;
  30.         do i=1 to dim(chara);
  31.                 if chara(i)='' then charamiss(i)+1;
  32.         end;
  33.         if last then do;
  34.                 do i=1 to dim(num);
  35.                         if nummiss(i)/&obs ge 0.5 then list=strip(list)||' '||strip(vname(num(i)));
  36.                 end;
  37.                 do i=1 to dim(num);
  38.                         if charamiss(i)/&obs ge 0.5 then list=strip(list)||' '||strip(vname(chara(i)));
  39.                 end;
  40.                 call symput('list',strip(list));
  41.         end;
  42.         %put &list.;
  43. data d;
  44.         set a(drop=&list.);
  45. run;
复制代码
已有 2 人评分学术水平 热心指数 收起 理由
crackman + 1 观点有启发
论坛数据分析 + 2 + 1 观点有启发

总评分: 学术水平 + 2  热心指数 + 2   查看全部评分

7
soporaeternus 发表于 2011-1-21 09:30:47
楼上data b最后加个
  1. stop;
复制代码
就更好了,呵呵
已有 1 人评分热心指数 收起 理由
论坛数据分析 + 1 这个头像吓死个人

总评分: 热心指数 + 1   查看全部评分

Let them be hard, but never unjust

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-25 03:11