4-1. 変数の作成と加工

SASでは読み込んだデータを使ってデータセットの中に新しい変数を作成したり、元の変数の値を置き換えたりできます。これらの操作はすべてDATAステップの中で行います。

これはかなり強調して説明しているのですが、学生が実際にSASを使い始めるとかなり高い確率でPROCステップの中で変数の加工をしようとしてしまいます。ようやくデータセットを作成して、いよいよ統計分析を行う段階になってから分析に必要な変数が見えてきて、そこで必要な変数を作成したくなる気持ちは解らなくもないのですが・・・。PROCステップで分析をする際に新たな変数が必要になった場合は、DATAステップに戻って必要な変数を作成したSASデータセットを作り、そのデータセットを用いてPROCステップを実行しなければなりません。

演算式

既存の変数から計算により値を求める場合は、代入式の右辺に計算式を直接記述します。通常の四則演算の他、べき乗や論理演算、比較演算などが行えます。代入式の左辺がデータセット中にない変数であれば新しく作成され、既に存在する変数であれば値が置き換えられます。

演算記号の例
加減乗除		+ - * /
べき乗		**
論理和・論理積	| (OR) & (AND)
比較		=(EQ) ^=(NE) <(LT) >(GT) <=(LE) >=(GE)
 ※論理和・論理積、比較は括弧内の記述方法も可
計算式の例
m=4;
x=(a+b)/c*100;
square=y**2;
logic=(h & i) | (j & k);
compare=(s <= t);

上の例で、変数mの値は4になります。変数xはaとbを加算してcで割ったものを100倍した値になります。変数squareはyの2乗になります。hとiが共に真(0以外)、またはjとkが共に真(0以外)の場合に変数logicは真(1)、それ以外の場合は変数logicは偽(0)になります。sがtと同じかtよりも小さければ変数compareは真(1)、sがtよりも大きければ変数compareは偽(0)になります。

演算子の優先順位は通常我々が紙に書いて計算する場合と同じと考えておけば間違いありません。心配な場合は括弧で優先順位を明示すると良いでしょう。


比較演算において、比較演算記号を2つ使って

a <= x < b

のような書き方ができます。これは読んでのとおり「xはa以上b未満」を意味し、

a <= x & x < b

と同等です。プログラミング言語によってはこのような書き方ができないものもありますが、SASは正しく認識してくれます。



またSASにはIN演算子という演算子があります。IN演算子は左辺の変数の値を右辺の値リストと比較して一致するものがあれば真(1)、なければ偽(0)を返します。例えば、

x in (5, 12, 27)

と書くと、xが5または12または27であれば真、そうでなければ偽になります。すなわち、

x=5 | x=12 | x=27

と書くのと同等です。


関数

SASの演算には関数も使えます。以下に関数の例を挙げます。

関数の例
SQRT(引数)		引数の平方根を返す
EXP(引数)		e引数を返す
LOG(引数)		引数の自然対数を返す
LOG10(引数)		引数の常用対数を返す
ABS(引数)		引数の絶対値を返す
ROUND(引数,丸め単位)	引数を指定の桁に四捨五入した値を返す
MAX(引数リスト)		引数リストの最大値を返す
MIN(引数リスト)		引数リストの最小値を返す
MEAN(引数リスト)		引数リストの算術平均を返す
SUM(引数リスト)		引数リストの合計を返す

引数リストは複数の変数をカンマで区切って指定します。

関数を用いた計算式の例
sqrt_x=sqrt(x);
lnx=log(x);
r=round(k,0.01);
max_val=max(a,b,c,d,e);
mean_val=mean(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10);

関数の引数リストには OF というキーワードを使って、接頭辞+数字という形の変数名の変数をまとめて指定することができます。例えば上のMEAN関数の例ではx1からx10までの10個の変数を指定していますが、これをOFを使うと mean(of x1-x10)と書けます。

欠損値

代入式の右辺が通常の計算式であって欠損値が含まれていた場合、左辺の変数は原則として欠損値になります。例外としてmax()やmean()などの統計関数では引数リストに欠損値が含まれていても計算されます。例えば次の例の場合、x1、x2、x3が1つも欠損値でないならどちらも同じ結果になりますが、欠損値が含まれる場合は結果が異なってきます。上の式ではx1、x2、x3に1つでも欠損値が含まれているとmean_xは計算できずに欠損値になりますが、下の式ではmean関数の引数に1つ以上有効な値があれば平均値が計算されます。

mean_x=(x1+x2+x3)/3;
mean_x=mean(x1,x2,x3);

また、論理演算や比較演算では欠損値は独特の扱いになります。論理演算では欠損値はfalse(偽)として扱われ、比較演算ではどのような数値よりも小さい値として扱われます。


それでは、「準備」で使ったdata4-1.xlsに入力されているデータを読み込み、新しい変数を作成して、ds41を作成し直してみます。data4-1.xlsのシートをCSV形式で保存したファイルをdata4-1.csvとします(以降、セルI225のデータは修正されているものとします)。「準備」で作成したプログラムのDATAステップに網掛けの部分を追加し、修正して実行します(コメント部分は入力しなくても構いません)。

【Sample 4-2】

/* Sample 4-2 */

data ds41;
  infile '/folders/myfolders/tutorial/data4-1.csv'
         /* ↑製品版SASの場合はdata4-1.csvを保存したフォルダに変更 */
         dlm=',' firstobs=3;
  input NO SEX $ AGE TABACO TABACO_N
        SAKE UNDO HEIGHT WEIGHT SBP DBP TC FBS;

  /* BMIを計算する */
  bmi=weight/(height/100)**2;

  /* 次の2つの変数に意味は無い
     計算方法の違いで欠損値の扱いがどのように違うか確認するだけ */
  test1=(dbp+tc+fbs)/3;
  test2=mean(dbp,tc,fbs);
run;

/* データセットの最初の50件を表示する */
proc print data=ds41(obs=50);
run;

/* 作成したtest1、test2の違いを確認する */
proc print data=ds41;
  var dbp tc fbs test1 test2;
run;

Sample 4-2を実行した結果はこのようになります。DATAステップでSASデータセットds41を作成した後、1つ目のPRINTプロシジャで最初の50件のデータを表示させています。データファイルにはなかった変数BMI、TEST1、TEST2が作成されている事を確認してください。2つ目のPRINTプロシジャで変数DBP、TC、FBS、TEST1、TEST2だけを表示させています。DBP、TC、FBSの欠損値によってTEST1とTEST2の内容がどのように異なっているか確認してください。変数TEST1はDBP、TC、FBSのうち1つでも欠損値があると欠損値になっています。一方、変数TEST2はDBP、TC、FBSに欠損値があったとしても、1つ以上有効な値があればその値を元に平均値が計算されています。


Sample 4-2はsample4-2.sasとして保存しておきます。