指定した変数以外の全ての変数に特定の値を割り当てる

実戦ではあまり使わない筋なので、ちょっとした遊びです。

今適当なデータセットがあって

data Q1;
X1=1;X2=1;X3=1;output;
X1=.;X2=2;X3=4;output;
X1=3;X2=3;X3=.;output;
run;








指定した変数以外の変数について値を全て99に強制変換せよというのが
課題だとします。

今回はX2の内容はそのままに、それ以外の変数を99にします。


data A1;
if 0 then set Q1;
retain _numeric_ 99;
set Q1(keep=X2);
run; 










とこんな感じです。

if 0 then setで変数情報だけ読み込ませているからretainでの指定が活きてくるわけですね。
そのあとにsetすれば、変数があればretainを掻き消すわけですね。

なんというかSASっぽいコードですね。




3 件のコメント:

  1. if _n_=1 then ... というのは良く見かけますが、if 0 then ... というのはどう理解すればいいのでしょう?
    今年もよろしくお願いします!

    返信削除
  2. こちらこそ今年もよろしくお願いします!
    if 0 then は if _N_=0 then など、要は実行されなければ何でもいいのです。
    setステートメントがあるとSASはそこで指定されているデータセットの変数情報を先に読み込みます、そこで変数情報だけいただいて、オブザベーションは読み込みません。
    変数情報は持っているのでretain _numeric_ 99; の_numeric_の対象がQ1のX1 X2 X3になります。
    その後ははじめて、本番のset Q1(keep=X2)なんですが、X2しかないので、X1 X3は先程のretainが効いて全部99になる感じです。
    説明が下手ですみません!!

    返信削除
  3. _N_=0という行は無いのに、setステートメントは生きていて変数属性のみ読み込むのですか・・・
    なんとも私には理解しにくいのですが、これまでData Stepを2つ書いていたことが1つで済むのはありがたいです。


    返信削除