1obsのデータセットの値を他のデータセットに対して引き延ばして結合する

今回は、僕が理屈を理解できていないことについて書きます。
もし説明してくださる方がいらっしゃればコメント等お願いいたします。

以下のように、10obsのデータセットと1obsのデータセットがあるとします。

data Q1;
do X=1 to 10;
 output;
end;
run;














data Q2;
 Y=5; Z=9;
 output;
run;



これに対して

data A1;
 set Q1;
 set Q2;
run;

を実行すると


結果は上記のようになります。
仮に

data A1;
 set Q2;
 set Q1;
run;

と順番を入れ替えても結果は同じです。

これについての理屈はわかります。
SET;SET;はいずれかのデータセットのファイル終端を見つけた時点でオブザベーションの
作成を打ち切るので、結果、常に指定データセットたちの中で最小のオブザベーションに
なる。ということだと思います。

しかし、

data A2;
 set Q1;
 if _N_=1 then set Q2;
run;

として実行すると結果は


となり、1obsの内容が全てに引き延ばされます。

ちなみに

data A2;
 if _N_=1 then set Q2;
  set Q1;
 run;

としても結果は同じです。

このテクニック自体は、SAS社のステートメントリファレンスでも紹介されており
以前から知っていて、何度も使ったことがあるのですが
ふと考えてみると、理屈が説明できない自分に気付きました。

やっていることはSET;SET;なわけで仮に_N_=1でしか実行されないとしても
実行された時点でQ2の1obsを読み込んだ後ファイル終点を見つけて処理が
止まって、完成は1obsになるのでは?と思ってしまいます。
PDVを理解できていない証拠なのですが、どなたか、なぜ完成が10obsになるか
を説明していただけないでしょうか?





2 件のコメント:

  1. こんにちは。
    PDVに関しては何か読んだり聞いたりしたことがないので、推測ですが、、
    これって、ファイル終点かどうかの判断を、次のobsを読み込む際に判断してるってことなんじゃないでしょうか?
    _n_=2の時は「Q1」をsetしてないので、「Q1」のファイル終点の判断自体してないのかなぁと。。
    PDVに詳しい人がいたら、わたしも知りたい。
    というかSASでそういうセミナー開いてもらいたいですね。

    わたしはちょっと前まで以下2つのプログラムが同じ結果を返してくれるものだと思っていたので、
    setステートメントとそのPDVは割りと奥が深いですよね。

    data A3;
    set Q1;
    set Q1;
    set Q1;
    run;

    data A4;
    do i=1 to 3;
    set Q1;
    end;
    run;


    それと大阪のSAS研究会おめでとうございます。
    わたしは、面白そうだけど会社が大阪まで行くの許してくれなそうです、残念。
    その次の「PDFファイルからSASデータセットへの変換」ていう発表も面白そうですね。
    発表頑張ってください!

    返信削除
    返信
    1. 有難うございます。すごい納得です!全obsを読み込み終わった時点ではなく、その次をいざ読み込もうとする時点でファイル終端かどうかがわかるということですよね、だからその次を読み込もうとする動きを回避すれば、処理はとまらないと!これ、すごい応用効きそう!目からうろこです!
      すごいです!正解かどうか僕にはわからないのですが、凄く納得しました。

      do ループでsetの挙動は、本当に怪奇現象にしかみえませんよね、、。to ○○で指定した数、置きにデータを抜き取る結果になるなんて、、、。

      PDF僕も凄い興味あるんです!どうやるんですかね?PDFファイル内に、テキストデータってどういう形で内包されてるのか?タグセットみたいな構造でそれを読むんですかね?また今度フィードバックしますね!

      削除