例えば
があって、
Xで重複を消して、Yを使って、Zを横展開しろと言われたら
迷うことなく
proc transpose data=Q1 out=A1(drop=_NAME_) prefix=Z_;
var Z;
by X;
id Y;
run;
で
ですね。
一番好きなプロシージャはと訊かれたらtransposeと答える僕なので
(訊かれたこと一度もありませんが)、これ以外のやり方がぱっと思いつかないんですよね。
ただ、最近知ったのが
proc sql noprint;
select max(Y) into:MY
from Q1;
quit;
data A2;
set Q1;
by X;
array Z_{&MY};
retain Z_;
if first.X then call missing(of Z_{*});
Z_{Y}=Z;
if last.X then output;
drop Y Z;
run;
で、この場合結果は同じです。
Yの値が例えば1と4だけなどで飛び値になっている場合、transposeだとZ_1とZ_4だだけが作られますが、こちらの方法だとZ_2とZ_3もnullで作成されるので、ケースによって使い分けれそうです。
Yの値が例えば1と4だけなどで飛び値になっている場合、transposeだとZ_1とZ_4だだけが作られますが、こちらの方法だとZ_2とZ_3もnullで作成されるので、ケースによって使い分けれそうです。
何が面白いって、retain 配列名が通るんですね!確かに、通りそうですけど、意外と
その発想がなかったです。
あとついでに関係ないけど、これまた最近知った
data A3;
array AX{2,3,4}(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
D1=dim(AX);
D2=dim2(AX);
D3=dim3(AX);
keep D1 D2 D3;
run;
へ~dim関数って dim2 dim3とかにして、次元ごとの数とれるんですね!
いつも1次元でdim使ってたけど、dim1ってことだったのか~




