SAS中文论坛

标题: 如何对两个数据集进行比对? [打印本页]

作者: shiyiming    时间: 2009-4-17 14:21
标题: 如何对两个数据集进行比对?
如何对两个数据集进行比对?例如我数据集a中有20个变量,每个变量有一个最小值和一个最大值。在b数据集中同样有20个变量,每个变量有很多的值。请教如何利用利用数据集a中的最小值和最大值对数据集进行比对,并将小于最小值和大于最大值的数据挑选出来?高手请指教,也可以联系我:QQ411506636,drug007@126.com,谢谢!
作者: Qiong    时间: 2009-4-17 17:19
标题: Re: 如何对两个数据集进行比对?
要在b里取出满足所有变量值在对应去间的观测?
作者: Qiong    时间: 2009-4-17 17:50
标题: Re: 如何对两个数据集进行比对?
周末前最后一贴  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
[code:19b7gqf6]
%let no=6;
data a;
input a1 a2 a3 ta1 ta2 ta3;
datalines;
5 22 30 5 10 23
10 22 30 50 10 23
10 22 30 5 100 23
;
run;

data b;
input a1 a2 a3 ta1 ta2 ta3;
datalines;
6 22 30 5 10 23
10 22 30 50 10 23
15 22 30 5 100 23
;
run;

proc means data=a max min;
output out=temp(drop=_type_ _freq_ );
run;

data _null_;
set temp;
if _stat_ in ('MIN')  then do;
call symput('min',catx(',',of _numeric_));
end;
if _stat_ in ('MAX')  then do;
call symput('max',catx(',',of _numeric_));
end;
run;

data max min;
set temp;
if _stat_ in ('MIN')  then output min;
if _stat_ in ('MAX') then output max;
drop _stat_;
run;

data y;
set b;
array  big{&amp;no} _temporary_ (&amp;max);
array  small(&amp;no) _temporary_ (&amp;min);
array temp(*)  _numeric_;
do i=1 to dim(temp);
if temp(i)&lt;= big(i) and temp(i)&gt;= small(i);
end;
drop i;
run; [/code:19b7gqf6]
作者: shiyiming    时间: 2009-4-18 13:56
标题: Re: 如何对两个数据集进行比对?
非常感谢您的回复以及你的程度。
    可能我没有把问题表述清楚,对以上问题再补充一点,希望能得到帮助!
    例如:数据集a中包含      
var    RBC   PLT     ALT     BUN
                                        min             3.5   100     0          2.5
                                        max            5.5    300    40         7.8
                    



                 数据集b中包含:  
center  number    RBC    PLT     ALT     BUN
                                              1         1            6       240      58       5.7
                                              1         2            4.5    450      20       2.8
                                              2        3            3.4     98        23       9.5
                                              2        4            5.6    230       50      3.8
                                              3        5             6.2   320       100    1.5
                                              3        6             4.5    200      21       3.9...........

我的问题是:如何将b数据集中 RBC  PLT  ALT  BUN  以数据a中的min 和max进行对比,将b中的RBC小于 数据集a中的min  或大于a中的max 挑出来?PLT  ALT BUN等也是如此。
作者: Qiong    时间: 2009-4-20 11:52
标题: Re: 如何对两个数据集进行比对?
刚发现我程序多贴了一段没有用的(生成max min 的data那段……),不好意思,可能误导你了
其实我前面的步骤就是生成一个max,min的summary,既然a已经给出了max,min,就更方便了。
[code:u7c6zwij]data a;
input var $ RBC PLT ALT BUN;
cards;
min 3&#46;5 100 0 2&#46;5
max 5&#46;5 300 40 7&#46;8
;
run;

data b;
input center$ number$ RBC PLT ALT BUN;
cards;
1 1 6 240 58 5&#46;7
1 2 4&#46;5 450 20 2&#46;8
2 3 3&#46;4 98 23 9&#46;5
2 4 5&#46;6 230 50 3&#46;8
3 5 6&#46;2 320 100 1&#46;5
3 6 4&#46;5 200 21 3&#46;9
;
run;

data _null_;
set a;
if upcase(var) in ('MIN')  then do;
call symput('min',catx(',',of _numeric_));
end;
if upcase(var)  in ('MAX')  then do;
call symput('max',catx(',',of _numeric_));
end;
run;

data y;
set b;
array  big{4} _temporary_ (&amp;max);
array  small(4) _temporary_ (&amp;min);
array temp(*)  _numeric_;
do i=1 to dim(temp);
if temp(i)&gt;= big(i) or temp(i)&lt;= small(i);
end;
drop i;
run; [/code:u7c6zwij]
作者: shiyiming    时间: 2009-4-22 16:42
标题: Re: 如何对两个数据集进行比对?
data a;
input var $ RBC PLT ALT BUN;
cards;
min 3.5 100 0 2.5
max 5.5 300 40 7.8
;
run;

data b;
input center$ number$ RBC PLT ALT BUN;
cards;
1 1 6 240 58 5.7
1 2 4.5 450 20 2.8
2 3 3.4 98 23 9.5
2 4 5.6 230 50 3.8
3 5 6.2 320 100 1.5
3 6 4.5 200 21 3.9
;
run;

%let varlist=&quot;RBC PLT ALT BUN&quot;;

%macro sep_var;
%do i=1 %to 4;
%global var&amp;i;
%let var&amp;i=%sysfunc(scan(&amp;varlist,&amp;i,&quot; &quot;));
%put &amp;&amp;var&amp;i;
%end;
%mend;

%sep_var

%macro max_min;
%do i=1 %to 4;
%global max&amp;&amp;var&amp;i min&amp;&amp;var&amp;i;
proc sql noprint;
  select max(&amp;&amp;var&amp;i) ,min(&amp;&amp;var&amp;i)
  into :max&amp;&amp;var&amp;i,:min&amp;&amp;var&amp;i
  from a;
quit;
%end;
%mend;
%max_min

%put &amp;minaLt;

%macro t;
data target;
set b;
%do i=1 %to 4;
   if  &amp;&amp;var&amp;i &gt; &amp;&amp;&amp;&amp;min&amp;&amp;var&amp;i and &amp;&amp;var&amp;i&lt;&amp;&amp;&amp;&amp;max&amp;&amp;var&amp;i then &amp;&amp;var&amp;i='s';
%end;
run;
%mend;

%t
作者: shiyiming    时间: 2009-4-26 00:14
标题: Re: 如何对两个数据集进行比对?
[code:1fum3jk7]data a;
input var $ RBC PLT ALT BUN;
cards;
min 3&#46;5 100 0 2&#46;5
max 5&#46;5 300 40 7&#46;8
;
run;

data b;
input center$ number$ RBC PLT ALT BUN;
cards;
1 1 6 240 58 5&#46;7
1 2 4&#46;5 450 20 2&#46;8
2 3 3&#46;4 98 23 9&#46;5
2 4 5&#46;6 230 50 3&#46;8
3 5 6&#46;2 320 100 1&#46;5
3 6 4&#46;5 200 21 3&#46;9
;
run;

proc sql;
create table xx as
   select max(rbc) as RBCX,min(rbc) as RBCN,
          max(PLT) as PLTX,min(PLT) as PLTN,
                  max(BUN) as BUNX,min(BUN) as BUNN,
          max(ALT) as ALTX,min(ALT) as ALTN
from a;
quit;

data ex(where=(aa=0) keep=center number RBC PLT ALT BUN aa);
   set xx;
   do i=1 to 6;
   set b;
    aa=(rbcx &lt; rbc)+(rbcn &gt; rbc)+(pltx &lt; plt)+(pltn &gt; plt)
        +(BUNx &lt; BUN)+(BUNn &gt; BUN)+(ALTX &lt; ALT)+(ALTn &gt; ALT);
   output;
                end;
run;[/code:1fum3jk7]

ps:变量多的话,用macro。
作者: shiyiming    时间: 2009-4-28 16:49
标题: Re: 如何对两个数据集进行比对?
非常感谢各位的解答,非常的受用,在此谢过了!!! <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->




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