IMLプロシジャで全変数全obsで最大の値をとる

以前勤めていたところがSASのIMLのライセンスを導入していなかったため、IMLプロシジャを使ったことがありませんでした。
しかし、またまたSAS University EditionだとIMLが使えるということで、早速使ってみました。

僕の頁 <SASと臨床試験と雑談と>で、IMLは行列計算だけでなく、データセットの加工手段としても使えるみたいなことが示唆されていたので
「IMLによるデータセットの作成と読み込み」
http://sasboku.blog.fc2.com/blog-category-15.html

早速、前からIML使ったらどう書くんだろうと気になっていた第1回目の記事の詰めSAS一問目、
「データセット中の最大の値を1変数1obsのデータセットに格納する最善手を考えよ」
http://sas-tumesas.blogspot.jp/2013/09/sas1obs.html
という問題を考えます



さて以下のデータセットから

data Q1;
input X Y Z;
cards;
1 4 3
2 9 8
7 6 5
;
run;







から最大の値、9をとれということです。

まあ、結論としてa matsuさんの提案された

proc sql;
create table A4 as
select max(max(X,Y,Z)) as M
from Q1;
quit;


が一番すっきりしていて、SASのmax関数とSQLのmax関数の働きを併せているところが面白いというのもあり、最善手だと思っていますが、前々からこの問題はIMLが向いてそうだから、いつかやってみたいなぁと思っていたんですね。

以下が僕が書いたコードです。
ちょっとIMLに慣れてないので、できていないところがあればご指摘ください。


proc iml;
 use Q1;
 read all into _M;
 M=max(_M);
 create A5 from M[colname='M'];
 append from M;
quit;





結果は以下の通りです。


あ~、すっきりした!




0 件のコメント:

コメントを投稿