DATAステップにおける処理

以下に各節ごと,各項ごとに説明を行う。タイトルの後の[]内にあるアルファベットは,習得の必要性,あるいは難易度を示した。アルファベットが前の方ほど必要あるいは容易であることを示す。一応の目安としてはAとBとでとりあえずデータ処理ができる程度と考えてよい。2つ以上の方法がある処理については容易な方を見出しに示した。

SASデータセット名の指示

DATA d1; * 省略された場合[DATA; ]は自動的に DATA1, DATA2, ... となる)

利用する変数名,データセット名等の名前について,次の規則がある。

SETステートメント使用について[C]

既存のSASデータセットから読み込む。SETステートメントを用いる場合には変数を指定する必要はない。SASデータセットは変数の属性情報を持っているからである。
DATA test1;
SET sastest; * sastest というデータセットからデータ を読み込む;

フォーマット入力[B]

読み込み方法をインフォーマットで指定して読み込む方法。オブザベ−ション中に多数の変数がある場合などに有効。一文字でもずれてはならない。

┌────────────────────────┐
│INPUT (id    name    sex height weight  f1-f4)  │
│      (3. +1 $10. +1 1. +1 3. +1 2. +1  4*1.);  │
│CARDS;                                          │
│001 MIRAN      2 110 15 1234                    │
│002 RYUTO      1 165 66 5678                    │
│----+----+----+----+----+----+----              │
│    5   10   15   20   25   30                  │
└────────────────────────┘
○CARDS命令で使用する場合でも上記のように第一カラムからデ−タを書かなくてはならない
○変数名は「英字または下線( _) で始まる8文字以内の英数字(半角)」
○データが複数の行に渡る場合には /(スラッシュ) で区切る。
○数値変数の場合,フォーマットは "w.d" で,w はフィールドの長さ(1〜32) 。d は小数点以下の桁数。
○文字変数の場合,フォーマットは "$w." で, w はフィールド の長さ(1〜200)。

欠損値の扱い[A]

通常は,欠損値の箇所に .(ピリオド)を入力しておけば,以下の分析で自動的に欠損値として扱ってくれる(フォーマット入力の場合は,当該の箇所を空白にしておくだけでもよい)。

特定のデータ値を欠損値扱いにしたい(たとえば,ある質問で,「どちらともいえない」にした場合,9を与えていたが,これをすべて欠損値として扱いたい)場合には,

IF score=9 THEN score=.;

とする。多数の変数について行なう必要がある場合は,配列を使用する。
回答忘れと回答拒否など,欠損値に二種類以上の意味を持たせたい場合は特殊欠損値を使用する。
特殊欠損値に使用出来る文字はA〜Zと下線(_)の27文字。特殊欠損値は数値変数だけで使用可能。例えば,RとXを特殊欠損値として使用する場合は以下のようにすればよい。
DATA d1;
MISSING R X;
INPUT id questnl;
CARDS;
8401 2
8402 R
8403 1
8404 X
8405 2
;
....

新しい変数の生成[B]

新しい変数を作成するには,等号の左辺にその変数をおいて,右辺の式の値を割り当てる。
age = INT(( expdate - birthday) / 365.25);* 実験日と誕生日から年齢を計算;
Rohrer = weight / (height*height*height) * 10000000; * ローレル指数;
mes = ' メッセージ';


※上記の場合,expdateなど以後不要になる変数は,消去するのが望ましい。

右辺にそれまで存在しない変数を書くと,以下のようなメッセージで警告される。
NOTE: 変数 ××× は初期設定されていません.

文字変数の生成[C]

文字型変数が新たに作成される場合,その文字数は「最初に代入された文字の長さ」によって決定される。その後で 最初の文字数を越える文字数を入力しても超過分は無視されてしまうので注意が必要。 これを避けるにはLENGTHステートメントを使い,あらかじめ使用する文字数を設定する。

LENGTH mes $ 15;

関数を使用した変数の生成[C]

本節最後に使用できる関数の一覧があるが, SUM関数を用いると
fsum = f1+f2+f3+f4; [1]


fsum = SUM(OF f1-f4);[2]

と書ける。 ※f1-f4 に欠損値のある場合にはfsumの値が異なることに注意すること。[1]の場合はfsumは欠損になり,[2]の場合は欠損でない値のみの合計が得られる。即ちSUM関数は欠損値を無視する。

変数の消去[C]

保存する必要がない変数はDROPステートメントで消し去るか,KEEPステートメントによって残したい変数だけを指定する。どちらか一方しか指定できない。

fsum = f1+f2+f3+f4; DROP f1-f4; * f1,f2,f3,f4 を消去する;

あるいは,
fsum = f1+f2+f3+f4; KEEP fsum; * fsum だけを残す;

タイトル,脚注つけ[B]

TITLEステートメントを使用し,出力のページごとにタイトルをつける。10行まで可能。
DATAステップの中にもPROCステップの中にも,それらの外にでも,要するにどこにでも書けるステートメントである。一度使用するとその後もずっと,そのままなので,途中で無効にしたい場合にはその旨指示する必要がある。
ページの最後の部分に出力ページごとに文字列をいれたい場合は,「TITLE」のかわりに「FOOTNOTE」とする。
TITLE1 'これはタイトルです'; *;
TITLE3 'これもタイトルです'; * TITLE2 は空白になる;

TITLE; * これ以後はTITLE1 は使わない;

ラベル[B]

変数へのラベル[B]

変数にラベルをつける。その結果,どのような処理を行っているかわかりやすくなる。ラベルは 40 文字以内,単引用符( ' ) で囲む。この中では漢字の使用可。

LABEL gaku='学年' sex=' 性別' syushin=' 出身地';

変数値へのラベル[B]

変数の持つ値に対してラベルをつける。 1. FORMATプロシジャによって変数の出力フォーマットを定義する。文字変数に対するフォーマットの場合には最初に$ をつけ, 文字変数自身も ' ' でくくる。
2. DATAステップ(PROCステップでも可)内のFORMATステートメントで変数とフォーマットを結びつける。フォーマット名には必ずピリオドをつける。
  ┌─────────────────────────────┐
  │PROC FORMAT;                                              │
  │ VALUE gakuf 1=' 1年生' 2=' 2年生'   3=' 3年生';       │
  │ VALUE $ sexf 'M'='男' 'F'=' 女';                         │
  │ VALUE syuf 1='札幌' 2=' 札幌以外の道内'   3=' 道外';     │
  │               ....                                       │
  │RUN;                                                      │
  │                                                          │
  │DATA ×××× ;                                           │
  │             ....                                         │
  │ FORMAT gaku gakuf.  sex sexf. syushin syuf.;             │
  │                 ↑         ↑            ↑              │
  │                    ピリオドに注意                        │
  └─────────────────────────────┘

ラベルの消去と再定義[C]

変数へ付けたラベルを,以下の書式によって消去したり再定義できる。

変数へのラベルの消去と再定義

┌────────────────┐
│ LABEL gaku=' ' ; [1]           │
│                            │
│           空白にする           │
│                                │
│ LABEL gaku=' グレード' ; [2]   │
└────────────────┘

[1] 消去の例 [2] 再定義の例

変数値へのラベルの消去と再定義

PROC ××××;  
‥‥      
FORMAT gaku ;[1]
RUN;       


[1] 消去の例.定義のとき必要だった gakuf. を書かない。

※再定義の場合はPROC FORMATを再度書く。

オブザベーションの削除[B]

特定のオブザベーションを除いて処理する場合にDELETEステートメントを使用する。

IF sex='m' THEN DELETE; * 男性のデータ を削除;
IF sex='m' THEN; ELSE DELETE; * 男性のデータ 以外を削除;
IF 3<=_N_<=9 THEN DELETE; * [1] ;

[1]オブザベーションの3〜9番を削除

オブザベーションの格納(データセット化)[C]

OUTPUTステートメントを用いて指定された複数のSASデータセットへオブザベーションを格納する(DATAステップで扱われるSASデータセットが1つだけの場合には普通にやればよく,特に必要ない)

DATA a b c; * 3 つの データセット 名(a b c) を指定;
INFILE in;
INPUT......
index=(weight-best)/weight;

IF index >= 10 THEN OUTPUT a;
ELSE IF index <= -10 THEN OUTPUT b;
ELSE OUTPUT c;
.........

オブザベーションの削除,格納の機能を用いて条件別の処理(男女別,年齢層別など)を効率良く行うことができる

(例1)sex 変数の1 が男性, 2 が女性とする。

DATA d1; ...... IF sex = 1; ......

または

DATA d1; ...... IF sex = 2 THEN DELETE; ......

であれば,データセット d1 には男性のデータのみが残る。

(例2)sex 変数の1 が男性, 2 が女性とする。

データセットを男性,女性,その他に分ける場合,以下のようにする。これで3つのデータセットが同時に作成される。

DATA test male female newhalf;
......
IF sex = 1 THEN OUTPUT male; ELSE IF sex = 2 THEN OUTPUT female;
ELSE OUTPUT newhalf;

またたとえば,PROCステップ において,

PROC MEANS DATA=male; ...

というように指定することによって,必要なデータセットだけに対して分析を行うことができる。

データセットの結合[C]

OSデータセットへのデータの出力[D]

反復処理の方法[D]

戻る  進む  ホームページへ
mailto: toyomura@hokusei.ac.jp
home page: http://www.ipc.hokusei.ac.jp/~z00105/index.html