0

欠落している列にデータを入力するため、または既存の列から派生させるために、SASDatastepロジックが必要なデータセットがあります。

データセットは次のようになります。

  mpi  v1  v2  v3......v9  v10  v11.....v50
  001      a                    1.324
  002      c                    0.876
  003      f                    11.9
  004      r                    5.7
  005      b                    3.3
  .        .                     .
  .        .                     .   
  n        t                    0.4                   

私は実際に以下のプログラムを開発しました:

 /*a*/
 IF v2 ('a') AND 0 <= v11 <= 2 THEN DO;
 v13 = 1;
 v14 =20;
 END;
 IF v2 IN ('a') AND 2 < v11 <= 3.1 THEN DO;
 v13 = 2;
 v14 =40;
 END;
 IF v2 IN ('a') AND 3.1 < v11<= 5.3 THEN DO;
 v13 = 3;
 v14 =60;     END;
 IF v2 IN ('a') AND 5.3 < v11 <= 11.5 THEN DO;
 v13 = 4;
 v14 =80;
 END;
 IF v2 IN ('a') AND v11 > 11.5 THEN DO;
 v13 = 5;
 v14 =100;
 END;

私の要求は、 v2 IN c、、、、などの場合にv13とv14にデータを取り込むために同じプログラムを作成する必要があることです。ただし、v11ではバウンドのパラメーターが異なり(、、、、 ...で分離)、v13とv14はカテゴリーで同じままです。ftrceg

プログラムの繰り返しを避けるために、SASマクロを使用してこれを実行したいと思います。これを手伝ってもらえますか?

4

1 に答える 1

0

これを行う最善の方法は、v2、v11、v13、v14 の値でデータセットを作成し、それをマージするか、データセットと結合することです。

値の範囲がある場合、これを行うのは少し複雑ですが、決して不可能ではありません。

v2、v11min、v11max、v13、および v14 のデータセットがあるとします。

data mergeon;
input v2 $ v11min v11max v13 v14;
datalines;
a 0 2 1 20
a 2 3.1 2 40
a 3.1 5.3 3 60
a 5.3 11.5 4 80
a 11.5 9999 5 100
c 0 4 1 20
c 4 8.1 2 40
c 8.1 9.6 3 60
c 9.6 13.5 4 80
c 13.5 9999 5 100
;;;;
run;

data have;
input mpi v2 $ v11 v13 v14;
datalines;
1 a 2 0 0
2 a 4 0 0
3 c 1 0 0
4 c 7 0 0
5 c 9 0 0
6 a 22 0 0
7 a 10 0 0
;;;;
run;



proc sql;
create table want as
  select H.mpi, H.v2, H.v11, coalesce(M.v13,H.v13) as v13, coalesce(M.v14,H.v14) as v14
   from have H 
   left join mergeon M
   on H.v2=M.v2
   and M.v11min < H.v11 <= M.v11max
;
quit;

COALESCE は最初の非欠損値を選択します。つまり、M.v13 が欠損している場合 (つまり、マージがマージオン テーブルでレコードを見つけられない場合) にのみ H.v13 値を保持します。

SQL に慣れていない場合は、他のいくつかのオプションを使用することもできます。ハッシュ テーブルがおそらく最も簡単ですが、update ステートメントを使用することもできます (私自身はそれほど詳しくありません)。

于 2013-02-18T17:26:03.227 に答える