SAS中文论坛

标题: 求助:如何高效的填补空缺值 [打印本页]

作者: shiyiming    时间: 2008-3-5 14:44
标题: 求助:如何高效的填补空缺值
如果merge多个表,经常发生key值不匹配的情况,这样就会产生大量的空缺值。在modeling的时候又需要把这些空缺值填补完。如果变量很多,这项工作就会变得异常艰巨,所以我想请教有没有好办法,在merge的时候就填补完空缺值,而不必写大量的if x1=. then x1=0;这样的语句。
[code:1mr75ar9]data a;
infile datalines;
input x y1 y2;
datalines;
1 1 2
2 2 3
4 4 5
;
run;

data b;
infile datalines;
input x y3 y4;
datalines;
1 1 2
3 3 4
;
run;

data c;
merge a(in=ina) b(in=inb);
by x;
run;[/code:1mr75ar9]
作者: shiyiming    时间: 2008-3-5 15:05
标题: Re: 求助:如何高效的填补空缺值
data c;
merge a(in=ina) b(in=inb);
array a(*) y1 y2;
array b(*) y3 y4;
by x;
do i=1 to 2;if ^ina then a(i)=0;end;
do j=1 to 2;if ^inb then b(j)=0;end;
drop i j;
run;

不知这得效率如何..... (空缺都补为0的话)
作者: shiyiming    时间: 2008-3-5 15:08
标题: Re: 求助:如何高效的填补空缺值
我想了一个,不算太好,所以先不贴。。。。。。。。。。。。
想好再说。
作者: shiyiming    时间: 2008-3-5 15:11
标题: to tianwild
算是好办法了,这样的确可以节约很多时间了,谢谢你!

最好是有高手知道我们都不知道的option,statement,function能简单的搞定的。如:z=nmiss(of y1-y2);
一下程序虽然完全不切题,完全没关系,但是想给大家一些发散的思维。
[code:zp1n2dwo]data survey;
   missing a r;
   input id answer;
   datalines;
001 2
002 R
003 1
004 A
005 2
;[/code:zp1n2dwo]
命不好,目前为止我还没有在SAS HELP找到这样的“神奇”语句能击中“要害”的,哈哈哈。所以想来与大家探讨。
作者: shiyiming    时间: 2008-3-5 15:18
标题: Re: 求助:如何高效的填补空缺值
添加[code:2ck9lfqn]options missing=0;[/code:2ck9lfqn]
作者: shiyiming    时间: 2008-3-5 15:24
标题: to waterlwh
“神奇”的option终于出现了,完全好使,谢谢啦!

不过需求再进一步:我想一部分变量的却是值设为0,另一部分设为-999。可能就要写macro来实现了,我自己再想下去好了。

anyway,非常感谢!
作者: shiyiming    时间: 2008-3-5 15:31
标题: Re: 求助:如何高效的填补空缺值
果然神奇的options,以前看的时候没在意有这样的妙用... <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
作者: shiyiming    时间: 2008-3-5 15:37
标题: Re: 求助:如何高效的填补空缺值
报告:发现问题了!
[code:2edmqcd3]data c;
merge a(in=ina) b(in=inb);
by x;
if y4=&#46; then y4=-999;
run;

data d;
set c;
z=y1+y2+y3+y4;
run;[/code:2edmqcd3]
[quote:2edmqcd3]848  data d;
849  set c;
850  z=y1+y2+y3+y4;
851  run;

NOTE: Missing values were generated as a result of performing an operation on missing values.
      Each place is given by: (Number of times) at (Line):(Column).
      1 at 850:5   2 at 850:8
NOTE: There were 4 observations read from the data set WORK.C.
NOTE: The data set WORK.D has 4 observations and 6 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds[/quote:2edmqcd3]
你会发现z的值好多都是缺失,证明option missing只是把显示改成了0,没有真正把值改成0。 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2008-3-5 15:54
标题: Re: 求助:如何高效的填补空缺值
<!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: --> 对的,写个判断是0 or 缺失的赋不同的值就可以知道了。翻了下书确实是这样....

看来得多多的实践才能理解其中的奥妙.....
作者: shiyiming    时间: 2008-3-5 16:35
标题: Re: 求助:如何高效的填补空缺值
<!-- s:? --><img src="{SMILIES_PATH}/icon_confused.gif" alt=":?" title="Confused" /><!-- s:? --> 假的真不了呀!
作者: shiyiming    时间: 2008-3-6 11:08
标题: to waterlwh
你这句话太有才了,赞一个!

这样看来,我就先采用tianwild的方法,用数组做吧。

还是期待更好的方法。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2008-3-6 15:04
标题: Re: 求助:如何高效的填补空缺值
Fancy的options我从来都不知道。
我的办法是要有两个缺失值的数据集。目标数据集merge后再与缺失值的数据集merge两下。注意排序。
[code:11t4iodf]data left;
  input id a$ b ;
  cards;
1 A 2
4 X 3
;
run;

data defaultL;
  A='@';
  b=0;
  Lflg=1;
run;

data right;
  input id c d;
  cards;
1 4 7
2 6 9
;
run;

data defaultR;
  C=0;
  d=99;
  Rflg=1;
run;

data big;
  merge left(in=inL) right(in=inR);
  by id;
  Lflg=not inL;
  Rflg=not InR;
run;

proc sort data=big;
  by Lflg;
run;

data final;
  merge   big defaultL;
  by Lflg;
run;

proc sort data=final;
  by Rflg;
run;

data final(drop=lflg rflg);
  merge   final defaultR;
  by Rflg;
run;[/code:11t4iodf]
作者: shiyiming    时间: 2008-3-6 15:37
标题: to ahuige
为解决大量(几百个)变量的补缺,这的确是个好办法。需要补缺的越多,这段程序的优势就越明显。谢谢你!

PS,我就是我目前使用的逻辑和方法,不谋而合。 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
作者: shiyiming    时间: 2008-3-6 22:24
标题: Re: 求助:如何高效的填补空缺值
唉,跟你们讨论每次都得动点儿脑子,想偷懒都不行。。。   <!-- s:? --><img src="{SMILIES_PATH}/icon_confused.gif" alt=":?" title="Confused" /><!-- s:? -->  
[code:195a4rtm]PROC STDIZE DATA=c REPONLY MISSING=0 OUT=c;
  VAR _numeric_;
RUN;[/code:195a4rtm]
作者: shiyiming    时间: 2008-3-7 09:07
标题: to superkuhasu
太牛X了!太感谢你了!

这次我真是赚了,一个小问题打开了一片新空间。
对于我个人来说proc stdize可是white space,越来越感到SAS真是博大精深啊。
作者: shiyiming    时间: 2008-3-7 11:19
标题: Re: 求助:如何高效的填补空缺值
<!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2008-3-7 11:26
标题: Re: 求助:如何高效的填补空缺值
搜索 &quot;sas-l&quot; missing value to zero ,以上的几种方法除了ahuige的都提到了,我想请教一下,这几种方法,到底那种效率比较高呢?
作者: shiyiming    时间: 2008-3-7 12:58
标题: to waterlwh
自己去试!
作者: shiyiming    时间: 2008-3-20 10:39
标题: Re: 求助:如何高效的填补空缺值
可以使用SAS/IML里的LOC函数
用LOC返还满足条件的元素在矩阵中的index,然后再把对应的元素设成0

[code:2ifhcb2d]proc iml;
use c;
read all into x&#91;colname=cols&#93;;
x&#91;LOC(x&lt;0)&#93;=0;
create d from x&#91;colname=cols&#93;;
append from x;
quit;[/code:2ifhcb2d]
作者: shiyiming    时间: 2008-4-4 01:23
标题: Re: 求助:如何高效的填补空缺值
The following program recode 999 and 888 to '.' (for numerical variables) or '  ' (for characteristic variables). By revising it , you can recode missing to any number you want or recode any number to missing value.

[code:1cju2kty]%macro recodemiss(dataset);
data &amp;dataset;
set &amp;dataset;
  array num&#91;*&#93;  _numeric_;
  array char&#91;*&#93; _character_;
  do i=1 to dim(num);
      if num&#91;i&#93; = 999 or num&#91;i&#93;=888 then num&#91;i&#93;= &#46;;
  end;
  do j=1 to dim(char);
      if char&#91;j&#93;=999 or char&#91;j&#93;=888 then char&#91;j&#93;= ' ';
  end;
run;

%mend recodemiss; [/code:1cju2kty]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2