Kengo Nagashima



縦長・横長データの相互変換

R には reshape 関数や、reshape パッケージの melt / cast 関数があり、縦長データと横長データを相互変換できる様になっています。SAS では transpose procedure によって、データ形式の相互変換ができるので、その方法について説明していきます。

横長データ

以下のような形式で入力されているデータを横長データという事にします。一群一列の形式で入力されているデータです。

data wide;
input var1 var2 var3;
cards;
2.12  2.21  2.34
2.13  2.22  2.35
2.14  2.23  2.36
2.15  2.24  2.37
2.16  2.25  2.38
2.17  2.26  2.39
2.18  2.27  2.30
2.19  2.28     .
;
run;

縦長データ

以下のような形式で入力されているデータを縦長データという事にします。群を区別する文字列変数 group と、結果変数 value の様な形で入力されており、すぐ解析を実施できる形です。

data long;
input group$ value;
cards;
var1  2.12
var2  2.21
var3  2.34
var1  2.13
var2  2.22
var3  2.35
var1  2.14
var2  2.23
var3  2.36
var1  2.15
var2  2.24
var3  2.37
var1  2.16
var2  2.25
var3  2.38
var1  2.17
var2  2.26
var3  2.39
var1  2.18
var2  2.27
var3  2.30
var1  2.19
var2  2.28
var3     .
;
run;

横長データから縦長データに変換する方法

この変換には少し工夫が必要です。
まず、前処理として、データステップで入力する際に obs = _n_; という行を追加しておきます。 次に、transpose procedure で、行 (obs) ごとに縦向きに転地して出力すると、横長のデータは縦長のデータに変換されます。

data wide;
input var1 var2 var3;
obs = _n_;
cards;
2.12  2.21  2.34
2.13  2.22  2.35
2.14  2.23  2.36
2.15  2.24  2.37
2.16  2.25  2.38
2.17  2.26  2.39
2.18  2.27  2.30
2.19  2.28     .
;
run;

proc transpose data = wide out = long;
  var var1 var2 var3;
  by obs;
run;

proc print;
run;

縦長データから横長データに変換する方法

あまり使う事は無いのですが、逆の変換についても考えてみます。
この場合は少し面倒ですが、transpose procedure を二回繰り返して使うことで、データを変換できます。

data long;
input group$ value;
cards;
var1  2.12
var2  2.21
var3  2.34
var1  2.13
var2  2.22
var3  2.35
var1  2.14
var2  2.23
var3  2.36
var1  2.15
var2  2.24
var3  2.37
var1  2.16
var2  2.25
var3  2.38
var1  2.17
var2  2.26
var3  2.39
var1  2.18
var2  2.27
var3  2.30
var1  2.19
var2  2.28
var3     .
;
run;
proc sort data = long;
  by group;
proc transpose data = long out = long;
  var value;
  by group;
proc transpose data = long out = wide;
  id group;
proc print;
run;

履歴