目次
1.サンプルデータ
サンプルとして、以下のようなデータで、欠損値レコードのデリートをしてみます。
data list;
infile datalines dlm="," dsd missover;
input ken:$10. sex:$10. age:8.;
datalines;
東京都,男性,20
,,
,,30
,,
,女性,50
,,
,,
神奈川県,男性,
,,
,,20
,,40
,女性,
,,
,,60
;
run;
以下のように、歯抜け状態のデータになっています。
2.展開例
1.全変数を対象とするパターン
全変数で判定する場合は、引数varを省略して下さい。
%del_allmiss(indata=list, outdata=list_del);
以下のように、全変数が欠損値(左図赤枠)のレコードがデリートされています。
2.対象変数を指定するパターン
特定の変数が欠損値の場合のみデリートするときは、引数varに対象変数を指定します。
%del_allmiss(indata=list, var=ken sex, outdata=list_del);
以下のように、指定した変数が欠損値のレコードのみデリートされています。
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;