全ての値が欠損値の数値変数と文字変数を削除する
[OS]ALL
[リリース] 6.12, 8.1, 8.2
[キーワード] MISSING, MISSING VALUE, VARIABLE
[質問]数値変数や文字変数の全ての値が欠損値の場合、それらの変数を削除する方法はありますか?
[回答]プロシジャやDATAステップのオプションなどでは、そのような機能はサポートされていません。次のマクロで、全ての値が欠損値の変数を削除できます。 /* サンプルデータセットの作成 */ DATA sample; INPUT num1-num3 (char1-char4) ($); CARDS; 1 . . A . . . . . . . . . B 3 . . C . . . ; RUN; %MACRO rm_miss(ds,out_ds); %** ds: 入力データセット ***; %** out_ds: 出力データセット ***; /* 文字変数名を取得 */ PROC CONTENTS DATA=&ds OUT=_out1(WHERE=(type=2)) NOPRINT; RUN; DATA _null_; SET _out1; CALL SYMPUT('n_c',LEFT(_n_)); CALL SYMPUT('c_var' || LEFT (_n_),name); RUN; /* 数値変数名を取得 */ PROC CONTENTS DATA=&ds OUT=_out2(WHERE=(type=1)) NOPRINT; RUN; DATA _null_; SET _out2; CALL SYMPUT('n_n',LEFT(_n_)); CALL SYMPUT('n_var' || LEFT (_n_),name); RUN; /* 各文字変数の欠損値以外の件数をカウント */ PROC SQL NOPRINT; %DO i = 1 %TO &n_c; SELECT COUNT(&&c_var&i) INTO:c&i FROM &ds WHERE &&c_var&i NOT = ' '; %END; QUIT; /* 各数値変数の欠損値以外の件数をカウント */ PROC SQL NOPRINT; %DO i = 1 %TO &n_n; SELECT COUNT(&&n_var&i) INTO:n&i FROM &ds WHERE &&n_var&i NOT = .; %END; QUIT; /* 全ての値が欠損値の変数を削除 */ DATA &out_ds; SET &ds; %DO i=1 %TO &n_c; %IF &&c&i = 0 %THEN %DO; DROP &&c_var&i; %END; %END; %DO i=1 %TO &n_n; %IF &&n&i = 0 %THEN %DO; DROP &&n_var&i; %END; %END; RUN; PROC DATASETS LIB=work NOLIST; DELETE _out1 _out2; RUN; QUIT; %MEND rm_miss; %rm_miss(sample,sample2); /* マクロの実行 */ |