4

私はこのようなデータセットを持っています(ただし、数百の変数があります):

id  q1  g7  q3  b2  zz  gl  az  tre
1   1   2   1   1   1   2   1   1
2   2   3   3   2   2   2   1   1
3   1   2   3   3   2   1   3   3
4   3   1   2   2   3   2   1   1
5   2   1   2   2   1   2   3   3
6   3   1   1   2   2   1   3   3

ID、b2、および tre を保持したいのですが、それ以外はすべて欠落に設定します。この小さなデータセットでは、簡単に使用できますcall missing (q1, g7, q3, zz, gl, az)が、より多くの変数を含むセットでは、事実上call missing (of _ALL_ *except ID, b2, tre*).

明らかに、SAS は私の心を読むことができません。元の変数を新しい ds にコピーしてポストにマージする別のデータ ステップまたは proc sql を含む回避策を検討しましたが、より洗練された解決策を見つけようとしています。

4

3 に答える 3

8

この手法では、未実行の set ステートメント (コンパイル時関数のみ) を使用して、元のデータ セット内のすべての変数を定義します。順序とすべての変数属性タイプ、ラベル、フォーマットなどを保持します。基本的にすべての変数を欠落に設定します。実行される次の SET ステートメントは、欠落に設定されていない変数のみを取り込みます。変数を明示的に不足に設定することはありませんが、同じ結果が得られます。

   data nomiss;
       input id  q1  g7  q3  b2  zz  gl  az  tre;
       cards;
    1   1   2   1   1   1   2   1   1
    2   2   3   3   2   2   2   1   1
    3   1   2   3   3   2   1   3   3
    4   3   1   2   2   3   2   1   1
    5   2   1   2   2   1   2   3   3
    6   3   1   1   2   2   1   3   3
    ;;;;
       run;
    proc print;
       run;
    data manymiss;
       if 0 then set nomiss;
       set nomiss(keep=id b2 tre:);
       run;
    proc print;
       run;

ここに画像の説明を入力

于 2016-02-02T21:26:24.863 に答える
1

変数がすべて同じ型 (数値または文字) の場合は、配列を使用できます。

data want ;
  set have;
  array _all_ _numeric_ ;
  do over _all_;
     if upcase(vname(_all_)) not in ('ID','B2') then _all_=.;
  end;
run;

順序を気にしない場合は、変数を削除して、0 観測値でそれらを追加し直してください。

data want;
   set have (keep=ID B2 TRE:) have (obs=0 drop=ID B2 TRE:);
run;
于 2016-02-02T20:29:30.337 に答える