FCMPでデータセットを配列に入れて色々する

ちょっとからかわれた話です。

data Q1;
input X1 X2 X3;
cards;
1 2 3
4 5 6
;
run;







みたいなデータセットから


を作る場合、

proc transpose data=Q1 out=A0(drop=_NAME_);
run;

で終わりなんですが、ある人が、proc fcmpで転置すると
データステップやIML、transposeで転置するより速いよ。って言ってきました。

FCMPを使うと行列を扱えるという話は
SAS忘備録の記事「FCMPプロシジャと行列計算」
で読んで、知ってたんですが、実際やったことなかったです。

proc fcmp;
   array X[2,3] / nosymbols;
   array Y[3,2] / nosymbols;
   rc=read_array('Q1',X);
    call transpose (X,Y);
   rc=write_array('A1',Y);
run;

で、先ほどと同じ結果を導けます。

で、一応データセットの大きさとか色々変えて試してみたんですが
どうも大して速くない気が…。むしろ2-3割くらい遅い?環境のせいかなと思って、訊いてみると、
「あれ嘘だよ。」と一言。悔しいので、一応記事にしました。

もう一ネタ。

data Q2;
input X1 X2 X3 X4;
cards;
1 . . .
2 5 . .
3 6 8 .
4 7 9 10
;
run;










みたいなのがあって、










を作れというような問題があって、IMLのライセンスがない場合、

proc fcmp;
   array X[4, 4] / nosymbols;
   rc=read_array('Q2', X);
   do i = 1 to 4;
      do j = 1 to 4;
         if missing(X[i, j]) then X[i, j] = X[j, i];
      end;
   end;
   rc=write_array('A2', X);
quit;

でいけるんですね。


0 件のコメント:

コメントを投稿