授業内容
2 SASデータセット
2.4 データセットの結合(Merge と Set)
さて、データの編集をデータステップの中で行なっていますが、データというものは刻々と変わっていくものです。実際この授業の中でも必要に応じて追加データを提出してもらっていますし、後から参加してきた諸君のデータも提出してもらっています。ここではそうやって集めた追加データを、データステップの中で編集する方法を学びます(エクセルなどのアプリケーションを使って表の中で編集する方が視覚的にはやりやすいかもしれませんが、相当量のデータを取り扱う場合にはこちらの方が早くて、正確なはずです)。
プログラム再掲
【プログラム先頭】
data cmp00;
input samno hght wght ft atnd allw;
cards;注)コピペ(コピー&ペーストの使いすぎは体に良くないです(涙))
1 157.0 . 24.0 2 .
2 177.7 76.5 26.0 4 100000
3 156.5 51.0 24.0 4 60000
4 173.0 59.0 27.5 4 30000
;
run;
proc print data = cmp00;
run;
*comment1;
/***
proc means data=cmp00;
var hght wght ft allw;
run;
proc plot data = cmp00; plot hght*wght; run;
***/
quit;
【プログラム末尾】
comment1以下の命令はここでは不必要なので、「/*(スラッシュ アスタ)」と「*/(アスタ スラッシュ)」でくくって、実行しないようにしています。
ここの後ろに以下の命令を追加してみましょう。
【追加データセット先頭】
data cmp01;
input samno name $ sex $;
cards;
1 さとみ F
2 リョウタ M
3 ai F
4 bukocha M
;
run;
proc print data = cmp01;run;
だから、もうちょっと手入力してみましょう。(爆)
data cmp02;
input samno hght wght ft atnd allw name $ sex $;
cards;
5 160 49 24 5 2500 kawayasu N
6 165 53 26.5 4 20000 コースケ M
;
run;
proc print data = cmp02;run;
quit;
【追加データセット末尾】
cmp01の方は、samnoの1から4に名前と性別のデータを追加するためのものです。ここで注意してほしいのは、名前のデータと性別のデータのいずれもが文字で入力されている(入力したい)点です。そこで、「name」という変数を文字として扱うためにスペースを一つ空けて「$(ドルマーク)」を後ろに付けてやります。性別もMaleとFemaleを分けるために文字式で対応させ、「$」の指定をしています(ただし、性別データがないものに関してはNで代用した)。
cmp 02の方は、データがはじめからすべてそろった形で入力するために、変数名をすべて列記しています。
まず、既存のデータに対して、変数を追加する方法を考えましょう。
今、cmp00はsamno、hght、wght、ft、atnd、allwの5つの変数が横に並んでいる形になっています。ここにその後ろから、nameとsexの変数をもつcmp01を追加してやりたい。その場合、MERGEステートメントを使います。
【追加プログラム先頭】
data cmp03;
merge cmp00 cmp01;
proc print data=cmp03;
run;
【追加プログラム末尾】
これは、左からcmp00、cmp01の順で表をならべて、その表にcmp03という名前を付ける命令になっている。proc printは表がきちんとできているか確認するためにつけたものです。
更に、そのcmp03という表の下側にcmp02の表を追加したいとき、SETステートメントという命令を使います。
【追加プログラム先頭】quitの前に挿入してください。
data cmp04;
set cmp03 cmp02;
proc print data=cmp04;
run;
【追加プログラム末尾】
これは上から順番に、cmp03、cmp02と並んでいる表を新しくcmp04と名付ける命令です。上と同様に、proc printは表がきちんとできているか確認するためにつけたものです。命令が正しければ次のような表が出力されるはずです。
OBS SAMNO HGHT WGHT FT ATND ALLW
NAME
SEX 1 1 157.0 . 24.0 2 . さとみ
F 2 2 177.7 76.5 26.0 4 100000
リョウタ
M 3 3 156.5 51.0 24.0 4 60000
ai
F 4 4 173.0 59.0 27.5 4 30000
bukocha
M 5 5 160.0 49.0 24.0 5 2500
kawayasu
N 6 6 165.0 53.0 26.5 4 20000
コースケ
M
ポイント
横に繋ぐときはMERGE、縦に繋ぐときはSETを使う。
2.5 ソート(並べ替え)
各サンプルを、ある変数の大きさに応じて並べ替える作業は実際よく行われることです。例えば身長順であったり、体重順であったり。
その操作を行なうのが、SORTプロシジャになります。SORTプロシジャの実行方法には、降ベキ(大きい方から順に小さい方へ)と、昇ベキ(小さい方から順に大きい方へ)の二通りがあります。SORTプロシジャは基本的に、昇ベキでソートを行ないますが、降ベキでソートをかけたいときは、BYステートメントによる変数の指定の前に「decending」という指定を行なってやります。以下で、cmp04について、先ず足のサイズftの小さい順にソートを掛けて、次に身長hghtの高い順でソートを掛けてやるプログラムを書いてみます。
【変更プログラム先頭】
data cmp04;
set cmp03 cmp02;
proc sort data = cmp04 out = cmp05;
by ft decending hght;
proc print data=cmp05;
run;
quit;
【変更プログラム末尾】
プログラムはcmp03とcmp02によって作られたcmp04を、BYステートメントでft、hghtの順にソートしてやり(ただし、hghtは降ベキで)、そのデータにcmp05という名前を付けています。表の名前を変更する必要がなければ「out = cmp05」の記述は必要ありません。
2.6 外部ファイルへの出力
さて、SASプログラム上で使用したデータセットは、SASを終了させると消えてしまいます。せっかくのデータセットですので、フロッピーディスクやハードディスクといった記憶装置の方に、記憶させることを考えてみましょう。
以下では、cmp04を新たに「cmp04.dat」という名前で、「z」ドライブ、すなわち外部ドライブの中の「SAS」というフォルダに記憶させに行く命令が書いてあります(3行目)。先程のcmp04のデータセットの中で実行してやりましょう。
【修正プログラム先頭】
data cmp04;
set cmp03 cmp02;
file 'z:\SAS\cmp04.dat';
put samno hght wght ft atnd allw name $ sex $;
proc print data=cmp04;
run;
quit;
【修正プログラム末尾】
ここでは、FILEステートメントとPUTステートメントという命令を使ってやっています。z という場所から「¥(円マーク)」を使って、階層を一つずつ降りていっています。
2.7 外部ファイルからの入力の確認
外部ファイルの読み込みにはINFILEステートメントとINPUTステートメントを使います。
【新規プログラム】
data cmp04;
infile 'z:\SAS\cmp04.dat';
input samno hght wght ft atnd allw name $ sex $;
run;
proc print data = cmp04;
run;
quit;
【新規プログラム末尾】
保存が旨くいっていて、プログラムが正しければ、先程と同じ表が得られるはずです。