SASマクロ データ変換

【SAS】指定した全変数が欠損値のレコードをデリート(削除)する(DELETE)

del_all

1.サンプルデータ

サンプルとして、以下のようなデータで、欠損値レコードのデリートをしてみます。

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

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

2.展開例

1.全変数を対象とするパターン

全変数で判定する場合は、引数varを省略して下さい。

%del_allmiss(indata=list, outdata=list_del);

以下のように、全変数が欠損値(左図赤枠)のレコードがデリートされています。
del_all
 

2.対象変数を指定するパターン

特定の変数が欠損値の場合のみデリートするときは、引数varに対象変数を指定します。

%del_allmiss(indata=list, var=ken sex, outdata=list_del);

以下のように、指定した変数が欠損値のレコードのみデリートされています。
del_select
 

3. 参考プログラム

以下は、参考プログラムになります。
右上のコピーボタンを押せば、プログラム全体をコピーできます。

%macro del_allmiss(indata=, var=, outdata=);
%put --------------------------------------------------;
%put del_allmiss;	/*指定した全変数が欠損値のレコードをデリート(削除)する*/
%put &=indata;		/*入力データセットを指定(データセットオプションの指定可)*/
%put &=var;			/*対象変数を指定(省略した場合は全変数で判定する)*/
%put &=outdata;		/*出力データセットを指定(データセットオプションの指定可)*/
%put --------------------------------------------------;

	/*データの読込*/
	data _del_allmiss_temp;
		set &indata.;
	run;

	/*対象変数のマクロ変数化*/
	proc contents data=_del_allmiss_temp %if %length(&var.) > 0 %then %do;(keep=&var.)%end;
				  out =_del_allmiss_cont
				  noprint;
	run;
	proc sort data=_del_allmiss_cont;
		by varnum;
	run;
	data _null_;
		set _del_allmiss_cont;
		call symputx("nword", _n_);
		call symputx(cats("var", _n_), name);
	run;

	/*デリートして出力*/
	data &outdata.;
		set _del_allmiss_temp;

		if 
		%do __i=1 %to &nword.;
			%if &__i.=1 %then missing(&&var&__i..);
			%else and missing(&&var&__i..);
		%end;
		then do;
			put "WARNING:指定した全変数が欠損値なのでデリートします。"(%do __i=1 %to &nword.;&&var&__i..%end;)(=);
			delete;
		end;
	run;

	/*不要データの削除*/
	proc datasets lib=work noprint;
		delete _del_allmiss_:;
	quit;

%mend del_allmiss;