TRANSPOSE プロシジャ

【SAS】TRANSPOSEプロシジャの基本的な構文と使い方(行列変換、転置)

構文

PROC TRANSPOSE DATA = 入力データセット
	        OUT = 出力データセット
	        PREFIX = 転置後の変数名接頭辞
	        ;
	BY BY変数(グループ変数);
	ID ID変数(転置後の変数名);
	IDLABEL ID変数ラベル用の変数(転置後の変数ラベル);
	VAR 転置変数;
RUN;

・VARステートメントに複数指定する場合は同属性にし、文字変数と数値変数を混合させると意図しない結果になる場合がある
・ID変数はBY変数グループごとにユニークでなければならない
・ID変数の変数値が変数の命名規則に反する場合、転置後の変数名が意図しないものになる場合がある

 

サンプルデータ

サンプルとして、以下のデータを使用していきます。

data sample;

	infile datalines dlm="," dsd missover;
	input
		type		:8.
		type_name	:$200.
		type_label	:$200.
		rank		:8.
		rank_eng	:$200.
		rank_label	:$200.
		maker		:$200.
		maker_label	:$200.
		uriage		:8.
	;
	
datalines;
1,Passenger,乗用車,3,three,三位,HONDA,ホンダ,30000
2,Light,軽自動車,4,four,四位,NISSAN,ニッサン,50000
2,Light,軽自動車,3,three,三位,DAIHATSU,ダイハツ,60000
1,Passenger,乗用車,1,one,一位,TOYOTA,トヨタ,110000
1,Passenger,乗用車,2,two,二位,NISSAN,ニッサン,40000
2,Light,軽自動車,1,one,一位,HONDA,ホンダ,110000
2,Light,軽自動車,2,two,二位,SUZUKI,スズキ,70000
;
run;

 

使い方

SAS Studioで実行しているため、BaseSASと出力結果が異なる場合がございます。

BY変数とID変数でソートする

TRANSPOSEプロシジャを使用する場合は、BY変数とID変数に指定する変数で、事前にソートした方が良いです。

proc sort data=sample;
	by type type_name type_label rank;
run;

proc transpose data=sample
			   out =sample_tran
			   prefix=rank_
			   ;
	by type type_name type_label;
	id rank;
	var maker;
run;

以下は出力データセット「sample_tran」になります。

この変数名「rank_1、rank_2、rank_3、rank_4」に付いている数字は、ID変数で指定したrankの変数値になります。
 

以下はID変数を使用しない例です。

proc sort data=sample;
	by type type_name type_label;
run;

proc transpose data=sample
			   out =sample_tran
			   prefix=rank_
			   ;
	by type type_name type_label;
	var maker;
run;

先ほどのID変数を指定したときの出力データセットの中身と並び順が異なっています。

変数名は同じに見えますが、今回の「rank_1、rank_2、rank_3、rank_4」の数字は、変数rankとは全く関係のない数字です。

PREFIX=に指定した接頭辞の後ろに、SASが自動で連番を付与しているだけになるので、ID変数ありとなしには注意が必要です。

 

VARステートメントに複数指定する

以下は、VARステートメントに変数を複数指定する例です。
この例では変数makerとmaker_labelの属性が文字型なので問題ありません。

proc sort data=sample;
	by type type_name type_label rank;
run;

proc transpose data=sample
			   out =sample_tran
			   prefix=rank_
			   ;
	by type type_name type_label;
	id rank;
	var maker maker_label;
run;

VARステートメントにmaker、maker_labelの順で指定したので、BY変数グループ内の並び順もmaker、maker_labelの順になっています。

 

以下は、VARステートメントに文字変数makerと数値変数uriageを指定した例です。

proc transpose data=sample
			   out =sample_tran
			   prefix=rank_
			   ;
	by type type_name type_label;
	id rank;
	var maker uriage;
run;

以下はSAS Studioでの実行結果で、BaseSASの出力結果と異なるかもしれませんが、uriageがブランクになっており、意図したようになっておりません。

ゆえに、VARステートメントに転置変数を複数指定する場合は同属性にするようにしてください。

 

IDステートメントとPREFIX=オプション

まずは、IDステートメントに数値変数rankを指定し、prefix=オプションを省略した例です。

proc transpose data=sample
			   out =sample_tran
			   ;
	by type type_name type_label;
	id rank;
	var maker;
run;

ID変数が数値の場合は、SAS変数の命名規則に反しないよう、数値の前にアンダースコア「_」が自動で付与されます。

 

次に、ID変数に文字変数rank_engを指定し、prefix=オプションを省略した例です。

proc transpose data=sample
			   out =sample_tran
			   ;
	by type type_name type_label;
	id rank_eng;
	var maker;
run;

文字変数rank_engの変数値が、SAS変数の命名規則に反していないので、その値がそのまま変数名になっています。

 

最後に、ID変数とPREFIX=の両方を省略した例です。

proc transpose data=sample
			   out =sample_tran
			   ;
	by type type_name type_label;
	var maker;
run;

両方省略した場合は、COL1、COL2、COL3、COL4、・・・、と転置後の列数に応じて、自動で変数名COLNが付与されます。

このCOLNも業務でそこそこ使用します。

 

IDLABELステートメントでラベルを付与する

IDLABELステートメントに、ID変数に対応する変数を指定すれば、ID変数にラベルを付与することができます。

proc transpose data=sample
			   out =sample_tran
			   prefix=rank_
			   ;
	by type type_name type_label;
	id rank;
	idlabel rank_label;
	var maker;
run;

以下のように、変数「rank_1、rank_2、rank_3、rank_4」にラベルが付与されています。

IDLABELステートメントは、業務で使用する頻度は少ないイメージです。