3

在 SAS 中,对于下面的两个测试数据集 - 对于“y”和“z”内的每个“数量”值,我需要提取相应的“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;
4

2 回答 2

2

加入两个数据集,使其amount介于y和之间z

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;

现在您的水果都在其自己的变量中,名为col1, col2, ...。如果您希望它们全部放在一个由空格分隔的变量中,只需将它们连接起来。

data trans2(keep= amount text);
set trans(drop=_name_);
array v{*} _character_;
text = catx(' ', of v{*});
run;
于 2013-03-19T21:35:58.477 回答
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 是一个“苹果”。

于 2013-03-19T21:49:57.020 回答