SASマクロ データ変換

【SAS】指定した変数にRETAINを掛ける(欠損値を埋める)

retain_all

1.サンプルデータ

サンプルとして、以下のようなデータにRETAINを掛けてみます。

data list;
	infile datalines dlm="," dsd missover;
	input ken:$10. sex:$10. age:8.;
datalines;
東京都,男性,20
,,
,,30
,,
,女性,50
,,
,,
神奈川県,男性,
,,
,,20
,,40
,女性,
,,
,,60
;
run;

以下のように、歯抜け状態のデータになっています。
list
 

2.展開例

・全変数にRETAINを掛けるパターン

全変数にRETAINを掛けたい場合は、引数varを省略して下さい。

%retain_var(
	indata	=list, 
	outdata	=list_retain
);

以下のように、全変数に対してRETAINが掛かっています。
retain_all

 

・特定の変数のみにRETAINを掛けるパターン

特定の変数のみにRETAINを掛ける場合は、引数varに対象変数を指定します。

%retain_var(
	indata	=list, 
	var		=sex,
	outdata	=list_retain
);

以下のように、指定した変数のみにRETAINが掛かっています。
retain_select
 

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;