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 件のコメント:
コメントを投稿