SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 761|回复: 7
打印 上一主题 下一主题

如何对两个数据集进行比对?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-4-17 14:21:54 | 只看该作者

如何对两个数据集进行比对?

如何对两个数据集进行比对?例如我数据集a中有20个变量,每个变量有一个最小值和一个最大值。在b数据集中同样有20个变量,每个变量有很多的值。请教如何利用利用数据集a中的最小值和最大值对数据集进行比对,并将小于最小值和大于最大值的数据挑选出来?高手请指教,也可以联系我:QQ411506636,drug007@126.com,谢谢!
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
沙发
发表于 2009-4-17 17:19:49 | 只看该作者

Re: 如何对两个数据集进行比对?

要在b里取出满足所有变量值在对应去间的观测?
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
板凳
发表于 2009-4-17 17:50:35 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-4-18 13:56:42 | 只看该作者

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等也是如此。
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
5#
发表于 2009-4-20 11:52:49 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-4-22 16:42:20 | 只看该作者

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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-4-26 00:14:27 | 只看该作者

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。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-4-28 16:49:38 | 只看该作者

Re: 如何对两个数据集进行比对?

非常感谢各位的解答,非常的受用,在此谢过了!!! <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 17:28 , Processed in 0.093579 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表