例えば
data Q1;
length X Y Z $10.;
X='ABC';Y='ACC';Z='ABC';output;
X='BBC';Y='BBC';Z='BBC';output;
X='CBC';Y='CBC';Z='CBB';output;
run;
Xの値とYの値、Xの値とZの値、Yの値とZの値を比較して同一かどうかを検証
したいとします。
方法はたくさんありますが、たとえば、compare関数を使えば
data A1;
set Q1;
XvsY=compare(X,Y);
XvsZ=compare(X,Z);
YvsZ=compare(Y,Z);
run;
のようになり、0であれば同一、数字は最初に差異が発見された位置を示しています
data A2;
set Q1;
YvsX=compare(Y,X);
ZvsX=compare(Z,X);
ZvsY=compare(Z,Y);
run;
のように指定をひっくり返すと
基準が逆転するので正負も逆転します。
で、こういうことをcompareプロシジャでやってみたい場合は
proc compare data=Q1;
var X X Y;
with Y Z Z;
run;
のようにvarとwithの指定順を同期させることで可能です。縦に見ると、何と何を比較しているか
わかりやすいです。
結果の抜粋は以下です。
ODSへの対応や、差異のデータセットへの吐き出しについてcompareプロシジャには
まだ改良の余地があると思うので、次期バージョンでもいいからてこ入れして欲しいなと思います。
世代管理機能でデータセットの更新履歴(更新前後のDS)を残す_GENMAX=オプション
SASは既に存在しているデータセットと同じ名前でデータステップを実行すると、既存の内容は消え、新しい内容に置き換わります。
古い内容を残すにはデータセット名を変えるしかない、、というわけではありません。
SAS8からGENMAX=オプションによる自動的な世代管理が可能です。
具体的にはデータステップでデータセットを作成する際にGENMAX=○をつけると○で指定した数字の分-1だけ、過去の状態をヒストリカルデータセットという形で自動保存してくれます。
今、genmax=3でデータセットQ1を作成します。
data Q1(genmax=3);
X=1;Y='A';output;
run;
プロパティを見ると最大の世代数3、現在の世代1となっています。
そして再度Q1でデータセットを作成します
data Q1;
X=1;Y='A';output;
X=2;Y='B';output;
run;
すると
勝手に「Q1#001」というものが作成され、中身を見ると
更新前のデータセットの内容になっています。
もう一度作成します
data Q1;
X=1;Y='A';output;
X=3;Y='C';output;
run;
さらに作成します。
data Q1;
X=1;Y='A';output;
X=4;Y='D';output;
run;
今、Q1のgenmaxは3なので、最新のQ1と二つのヒストリカルデータセットが保持されます。そのため、上記のように最も古いQ1#001は自動的に削除されます。
ちなみにこのデータセットはgennum=オプションを使って、データステップで指定できます。
1世代前のデータセットなら-1、2世代前なら-2とします。
data A1;
set Q1(gennum=-1);
run;
ちなみに名前リテラルで直接指定もできますが、世代番号はどんどん変わっていくので、
1世代前といった指定はできません。
data A1;
set 'Q1#003'n;
run;
今回は例なのでWORKにデータセットを作りましたが、通常は永久SASデータセットについて
行います。WORKにつくってもSAS閉じたら全部消えますからね。
よくあるのが、毎日結果を更新、つまり同名でデータセットを更新するプログラムで
何日か分の結果を残して置きたい時などです。
よく、昨日実行したときは、こうだった気がするけど、今日まわしたらこうだったから原因を調べて等と言われて、でも結果は最新しか残ってなかったりすると、ログからだけだとデバックが困難な場合もありますよね。そういった時も保険で、世代管理しておくと助かります。
よく使うのが
proc compare base=Q1 comp=Q1(gennum=-1);
run;
のようにして、どこが変わったか見たいときですね
古い内容を残すにはデータセット名を変えるしかない、、というわけではありません。
SAS8からGENMAX=オプションによる自動的な世代管理が可能です。
具体的にはデータステップでデータセットを作成する際にGENMAX=○をつけると○で指定した数字の分-1だけ、過去の状態をヒストリカルデータセットという形で自動保存してくれます。
今、genmax=3でデータセットQ1を作成します。
data Q1(genmax=3);
X=1;Y='A';output;
run;
プロパティを見ると最大の世代数3、現在の世代1となっています。
そして再度Q1でデータセットを作成します
data Q1;
X=1;Y='A';output;
X=2;Y='B';output;
run;
すると
勝手に「Q1#001」というものが作成され、中身を見ると
更新前のデータセットの内容になっています。
もう一度作成します
data Q1;
X=1;Y='A';output;
X=3;Y='C';output;
run;
さらに作成します。
data Q1;
X=1;Y='A';output;
X=4;Y='D';output;
run;
今、Q1のgenmaxは3なので、最新のQ1と二つのヒストリカルデータセットが保持されます。そのため、上記のように最も古いQ1#001は自動的に削除されます。
ちなみにこのデータセットはgennum=オプションを使って、データステップで指定できます。
1世代前のデータセットなら-1、2世代前なら-2とします。
data A1;
set Q1(gennum=-1);
run;
ちなみに名前リテラルで直接指定もできますが、世代番号はどんどん変わっていくので、
1世代前といった指定はできません。
data A1;
set 'Q1#003'n;
run;
今回は例なのでWORKにデータセットを作りましたが、通常は永久SASデータセットについて
行います。WORKにつくってもSAS閉じたら全部消えますからね。
よくあるのが、毎日結果を更新、つまり同名でデータセットを更新するプログラムで
何日か分の結果を残して置きたい時などです。
よく、昨日実行したときは、こうだった気がするけど、今日まわしたらこうだったから原因を調べて等と言われて、でも結果は最新しか残ってなかったりすると、ログからだけだとデバックが困難な場合もありますよね。そういった時も保険で、世代管理しておくと助かります。
よく使うのが
proc compare base=Q1 comp=Q1(gennum=-1);
run;
のようにして、どこが変わったか見たいときですね
登録:
コメント (Atom)



