ラベル proc datasets の投稿を表示しています。 すべての投稿を表示
ラベル proc datasets の投稿を表示しています。 すべての投稿を表示

fractフォーマットで分数表示

今、以下のコードを実行してみます。

data Q1;
X=1/3;output;
X=1/5;output;
X=2/9;output;
X=30/4;output;
run;

そして、出来たデータセットは










のように、割り切れない場合は、表示有効桁まで、値が続くわけです。

このデータセットにfractフォーマットをつけて表示するとどうなるでしょうか?

proc datasets nolist;
 modify Q1;
 format X fract.;
run;
quit;

として、再度開いてみると










お~、こうなるわけですね。
場合によっては、こっちで報告した方が分かりやすい場合もあるかもですね。
ケチな話、セル幅がコンパクトに済むし。


どうして今回、この話題にしたかというと、最近、知り合いの小学生の勉強を見たことがあって、
計算ドリルみたいなやつの答えあわせする羽目になったんですが、答えのページ切り取ったのがどっかいってなかったんですね。

やってた問題っているのが、ひたすら分数を約分させるっていう、ストレステストみたいな単純問題でした。

で、面倒なので、解いてる横で

data Q2;
 X=58/126;output;
 X=35/190;output;
 X=90/20;output;
 X=13/130;output;
 format X fract.;
run;

こんな感じでSAS書いて、実行しました。










で、便利ですね!



SASの一貫性制約(IC:integrity constraints)の話

Base SASにはデータセット内容の修正・変更を管理する技術が多く実装されていますが
日本での知名度がとても低く、利用例の報告が少ない気がします。

ただ、SAS認定プロフェッショナルのAdvancedの試験を公式テキストで学習された方は、そこに記載があるので知っている人が多いかもしれません。

今までこのブログでは
・世代データセット(Generration Datasets)
 記事「世代管理機能でデータセットの更新履歴(更新前後のDS)を残す_GENMAX=オプション」
 http://sas-tumesas.blogspot.jp/2013/11/dsgenmax.html

・監査証跡(Audit Trail)
 記事「SASのAudit Trail(監査証跡)機能について」
 http://sas-tumesas.blogspot.jp/2014/06/sasaudit-trail.html


などに触れたことがありますが、今回は
一貫性制約(IC:integrity constraints)について紹介します。

例えば今、以下のデータセットがあったとします。

data Q1;
X='A';Y=1;output;
X='B';Y=2;output;
X='C';Y=3;output;
run;







そしてこのQ1にこれから、データをどんどん追加していくとします。

しかしQ1というデータセットには、その内容について以下のルールがあるとします。

ルール1:Xの値はユニークで、非欠損値であること
ルール2:Yの値は非欠損値であること
ルール3:Yの値は3以下であること
ルール4:Xの値が「G」かつYの値が「1」であってはいけない

上記のルールに外れるデータは、データセット内に存在してはいけないとします。

そういった際に、データの追加・変更の都度、条件式を書いてチェックしていては大変です。
そこで、データセットそのものに、データの一貫性を保つ制約を設定しておくことで、自動的に
ルールに外れるものをはじく仕組みを作成できます。

具体的にはdatasetsプロシジャを使って

proc datasets nolist;
 modify Q1;
 ic create rule1=primary key(X)
           message='Xがユニークでないか、欠測値だから許容できません!';
 ic create rule2=not null(Y)
           message='Yは欠損値であってはならぬ!';
 ic create rule3=check(where=(Y<=3))
           message='Yは3以下!';
 ic create rule4=check(where=(not(X='G' and Y=1)))
           message='XがGかつYが1の組み合わせは不可!';
run;
quit;

と書きます。

ic create 任意のルール名=ルールで一貫性制約を作成します。
message=はルールによってデータが弾かれた場合に、ログに表示されるメッセージです。

ルールの記述法はSASのヘルプ等で確認してください。


そして

data Q2;
X='A';Y=1;output;
X='D';Y=.;output;
X='F';Y=4;output;
X='G';Y=1;output;
X='H';Y=2;output;
run;









というデータセットを先ほどのQ1に追加してみます。

proc append base=Q1 data=Q2;
run;



すると
ログに

















「WARNING: Xがユニークでないか、欠測値だから許容できません!  データセット WORK.Q1
への追加/更新に失敗しました。データ値が一貫性制約 rule1 に適合しません。 1 オブザベーションが拒否されました。
WARNING: XがGかつYが1の組み合わせは不可!  データセット WORK.Q1
への追加/更新に失敗しました。データ値が一貫性制約 rule4 に適合しません。 1 オブザベーションが拒否されました。
WARNING: Yは3以下!  データセット WORK.Q1 への追加/更新に失敗しました。データ値が一貫性制約 rule3に適合しません。 1 オブザベーションが拒否されました。
WARNING: Yは欠損値であってはならぬ!  データセット WORK.Q1 への追加/更新に失敗しました。データ値が一貫性制約rule2 に適合しません。 1 オブザベーションが拒否されました。
」

とでて、

Q1に追加されたのは1オブザベーションのみで、後は全てルールにひっかかって
追加されなかったいうことがわかります。











永久データセットに対して、データの追加や変更を繰り返しながら、保守していくような状況の
場合、これを設定しておくと、一貫性が保たれるので便利です。