SAS结合数据集,二进制搜索,索引

时间:2013-03-19 20:02:55

标签: loops dataset sas indices

在SAS中,对于下面的两个测试数据集 - 对于“y”和“z”内的每个“amount”值,我需要提取相应的“x”。可能存在符合标准的多个“x”值。 最终结果应如下所示:

/*
4 banana eggs
15 .
31 .
7 banana
22 fig
1 eggs
11 coconut
17 date
41 apple
*/

我意识到这依赖于使用索引或二进制搜索,但我无法找到可行的解决方案!任何帮助将不胜感激!谢谢!

data test1;
   input x $ y z;
   datalines;
   apple 29 43
   banana 2 7
   coconut 9 13
   date 17 20
   eggs 1 5
   fig 18 26
   ;
run;

data test2;
   input amount;
   datalines;
   4
   15
   31
   7
   22
   1
   11
   17
   41
   ;
run;

2 个答案:

答案 0 :(得分:2)

加入两个数据集,使amount介于yz之间。

proc sql;
create table join as 
select a.amount
      ,b.*
from test2 a
       left join
     test1 b
       on a.amount between b.y and b.z;
quit;

按转置金额对结果进行排序。

proc sort data=join; by amount; run;

转置它。

proc transpose data=join out=trans;
by amount;
var x;
run;

现在,您将自己的水果分别放在名为col1col2的变量中。 如果你想将它们全部放在一个由空格分隔的变量中,只需将它们连接起来。

data trans2(keep= amount text);
set trans(drop=_name_);
array v{*} _character_;
text = catx(' ', of v{*});
run;

答案 1 :(得分:0)

以下是使用“老式”数据步骤代码加PROC TRANSPOSE

的可能解决方案
data test1;
    input x $ y z;
    datalines;
    apple 29 43
    banana 2 7
    coconut 9 13
    date 17 20
    eggs 1 5
    fig 18 26
run;

data test2;
    input amount;
    datalines;
    4
    15
    31
    7
    22
    1
    11
    17
    41
run;

data want(keep=amount x);
   set test2;
   found = 0;
   do _i_=1 to nobs;
      set test1 point=_i_ nobs=nobs;
      if y <= amount <= z then do;
         found = 1;
         output;
         end;
      end;
   if not found then do;
      x = ' ';
      output;
      end;
run;

proc transpose data=want out=want2(drop=_name_);
   by amount notsorted;
   var x;
run;

注意我的结果与您的示例中的结果不符;金额31是“苹果”。