任意の変数の後に変数を追加する
[OS] ALL
[リリース] ALL
[キーワード] Base, add, variable, position
[質問]
既存のデータセットに新しく変数を追加するとき、変数の位置が最後になります。
[回答]
変数の位置は、DATAステップでの出現順になります。位置を直接指定する機能はありません。
下記の例では、変数がA1, A2, B1, B2のように並んでいるとき、A2の後ろにA3を追加するダミーのFORMATステートメントで、追加する位置より前の変数と追加する変数を指定しています。
DATA sample; /* サンプルデータセット作成 */
INPUT a1 a2 b1 b2 x $ y $ z $;
CARDS;
1 2 3 4 A B C
5 6 7 8 X Y Z
;
RUN;
DATA sample;
FORMAT a1 a2 a3; /* ダミーのFORMATステートメント */
SET sample;
a3=a1*100;
RUN;
変数が多い場合は、マクロを使用して、ダミーのFORMATステートメントの記述を簡略化できます。
%MACRO add_var1(indata,var);
%* indata: データセット名を指定 ;
%* var: どの変数の後に追加するか、変数名を指定 ;
%GLOBAL n_var;
PROC CONTENTS DATA=&indata
OUT=_work1(KEEP=name varnum) NOPRINT;
RUN;
PROC SORT DATA=_work1;
BY varnum;
RUN;
PROC SQL NOPRINT;
SELECT varnum INTO :n_var FROM _work1
WHERE UPCASE(name) = "%UPCASE(&var)";
QUIT;
%DO i=1 %TO &n_var;
%GLOBAL name&i;
%END;
DATA _NULL_;
RETAIN flg 0;
SET _work1;
IF flg=1 THEN STOP;
IF varnum = &n_var THEN DO;
flg=1;
END;
CALL SYMPUT('name' || LEFT(_n_),name);
RUN;
%MEND add_var1;
%MACRO add_var2(add_var);
%* add_var: 追加する変数名を指定 ;
FORMAT
%DO i=1 %TO &n_var;
&&name&i
%END;
&add_var;
%MEND add_var2;
/* マクロの実行例 */
/* NEWという変数をB2の後に追加する場合 */
%add_var1(sample,b2);
DATA sample;
%add_var2(new);
SET sample;
new=b1+b2;
RUN;
|
|