目次
1.サンプルデータ
サンプルとして、以下のようなデータにRETAINを掛けてみます。
data list;
infile datalines dlm="," dsd missover;
input ken:$10. sex:$10. age:8.;
datalines;
東京都,男性,20
,,
,,30
,,
,女性,50
,,
,,
神奈川県,男性,
,,
,,20
,,40
,女性,
,,
,,60
;
run;
以下のように、歯抜け状態のデータになっています。
2.展開例
・全変数にRETAINを掛けるパターン
全変数にRETAINを掛けたい場合は、引数varを省略して下さい。
%retain_var(
indata =list,
outdata =list_retain
);
以下のように、全変数に対してRETAINが掛かっています。
・特定の変数のみにRETAINを掛けるパターン
特定の変数のみにRETAINを掛ける場合は、引数varに対象変数を指定します。
%retain_var(
indata =list,
var =sex,
outdata =list_retain
);
以下のように、指定した変数のみにRETAINが掛かっています。
3. 参考プログラム
以下は、参考プログラムになります。
右上のコピーボタンを押せば、プログラム全体をコピーできます。
%macro retain_var(indata=, var=, outdata=);
%put --------------------------------------------------;
%put retain_var;/*指定した変数にRETAINを掛ける*/
%put &=indata; /*入力データセット名を指定(データセットオプションの指定可)*/
%put &=var; /*RETAINを掛けたい変数を指定(省略した場合は全変数対象となる)*/
%put &=outdata; /*出力データセット名を指定(データセットオプションの指定可)*/
%put --------------------------------------------------;
/*データの読込*/
data _retain_var_data;
set &indata.;
run;
/*変数属性の取得*/
proc contents data=_retain_var_data %if %length(&var.)>0 %then (keep=&var.);
out =_retain_var_cont
noprint;
run;
proc sort data=_retain_var_cont;
by varnum;
run;
/*変数属性のマクロ変数化*/
data _null_;
set _retain_var_cont;
call symputx("__n", _n_);
call symputx(cats("name", _n_), name);
call symputx(cats("type", _n_), type);
call symputx(cats("length", _n_), length);
run;
/*RETAIN*/
data &outdata.;
set _retain_var_data;
length
%do __i=1 %to &__n.;
%if &&type&__i..=2 %then %do;
__&&name&__i.. $&&length&__i..
%end;
%end;
;
retain
%do __i=1 %to &__n.;
__&&name&__i..
%end;
;
%do __i=1 %to &__n.;
if not missing(&&name&__i..) then __&&name&__i..=&&name&__i..;
else &&name&__i..=__&&name&__i..;
%end;
drop
%do __i=1 %to &__n.;
__&&name&__i..
%end;
;
run;
/*不要データの削除*/
proc datasets lib=work noprint;
delete _retain_var_:;
quit;
%mend retain_var;