3

SAS では、以下の 2 つのテスト データセットについて、"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

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ます。すべてを1つの変数に入れて空白で区切る場合は、それらを連結します。

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;

私の結果はあなたの例と一致しないことに注意してください。amount 31 は「りんご」です。

于 2013-03-19T21:49:57.020 に答える