SAS入門3

Last-modified: 2016-07-28 (木) 16:48:12

data step(変数の加工)

変数の加工について概要を説明します

options nocenter compress=yes;
libname mydata "c;\";

割り当て文(代入文)?

変数には,通常のプログラム言語と同じような書き方で,定数や別の変数から得られた値を代入することができます.
変数=(定数や変数と演算子や関数からなる計算式)

data sample;
 format ID Z3.;
 informat name $10.;
 informat sex $1.;
 informat station $10.;
 informat expense comma10.;
 format expense comma10.;
 input ID name $ sex $ station $ expense;
 annual=expense*12;                /*expenseの12倍を変数annualに与える*/
 tax=int(annual*0.05);             /*annualの5%の1円未満切捨てを変数taxに与える*/
 fromto="tokyo"||"<->"||station;/*tokyo<->最寄り駅の文字列を変数fromtoに与える*/
cards;
001 fujita M iidabashi  6,160
002 suzuki F shimokitazawa  13,650
003 takahashi  M funabashi    17,800
004 tanaka M yokohama 15,830
;
proc print;run;
OBS     ID      name      sex    station         expense    annual     tax            fromto
1     001    fujita        M     iidabashi         6,160     73920     3696    tokyo<->iidabashi
2     002    suzuki        F     shimokitazawa    13,650    163800     8190    tokyo<->shimokitazawa
3     003    takahashi     M     funabashi        17,800    213600    10680    tokyo<->funabashi
4     004    tanaka        M     yokohama         15,830    189960     9498    tokyo<->yokohama

ここで使われたのは,
積の演算子(*)と,文字列の連結の演算子(||),整数化する関数int()です.
もちろん,参照した変数自体に代入することで,元の変数の値を変更することもできます.

 

演算子には,
加減乗除(+,=,*,/)とべき乗(**)といった算術演算子
AND(&),OR(|),NOT(^),XORといった論理演算子
LT(<),LE(<=),GT(>),GE(=>),EQ(=),NE(^=)といった比較演算子
文字データに対しては,連結(||),前方一致(=:)などはすぐに使えると思います.

 

関数には,
数値に対するものと,文字に対するものがあります.以下のヘルプから全体を把握するといいでしょう.

ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >関数とcallルーチン>カテゴリ別の関数とcallルーチン

制御文

他のプログラム言語同様,IF THEN ELSE,DO,DO WHILE などの処理の流れを制御することができます.

ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>
の中のIF,IF-THEN/ELSE,DO/END,DO,DO UNTILE,DO WHILE,WHEN/SE

data sample;
 format ID Z3.;
 informat name $10.;
 informat sex $1.;
 informat station $10.;
 informat expense comma10.;
 format expense comma10.;
 input ID name $ sex $ station $ expense;
 if      sex="M" then title="Mr."; /*男にはMr.女にはMs.をつける*/
 else if sex="F" then title="Ms.";
 else                 title=.;
 do month=1 to 12;                                /*各自,1月から12月までの定期代の予算データを起こす*/
   if name=:"tanaka" and month in (1,2,3) then ; /*ただしtanakaのみ4月からとする*/
   else output;                                       /*outputは,obsを生成することを明示的に指示*/
 end;
cards;
001 fujita M iidabashi  6,160
002 suzuki F shimokitazawa  13,650
003 takahashi  M funabashi    17,800
004 tanaka M yokohama 15,830
;
proc print;
 by ID;                                             /*by文 ID毎に分けて印字*/
 var title name month station expense;      /*var文 印刷する変数とその順序を明示*/
 sum expense;                                    /*sum文 合計を印字*/
run;

print文にも,いくつかオプションを指定しましたので,以下のように出力されます.

ID=001
OBS    title      name      month     station        expense
 1     Mr.     fujita       1     iidabashi         6,160
 2     Mr.     fujita       2     iidabashi         6,160
 3     Mr.     fujita       3     iidabashi         6,160
 4     Mr.     fujita       4     iidabashi         6,160
 5     Mr.     fujita       5     iidabashi         6,160
 6     Mr.     fujita       6     iidabashi         6,160
 7     Mr.     fujita       7     iidabashi         6,160
 8     Mr.     fujita       8     iidabashi         6,160
 9     Mr.     fujita       9     iidabashi         6,160
10     Mr.     fujita      10     iidabashi         6,160
11     Mr.     fujita      11     iidabashi         6,160
12     Mr.     fujita      12     iidabashi         6,160
---                                               ----------
ID                                                   73,920
ID=002
OBS    title      name      month    station        expense
13     Ms.     suzuki       1     shimokitazawa        13,650
14     Ms.     suzuki       2     shimokitazawa        13,650
15     Ms.     suzuki       3     shimokitazawa        13,650
16     Ms.     suzuki       4     shimokitazawa        13,650
17     Ms.     suzuki       5     shimokitazawa        13,650
18     Ms.     suzuki       6     shimokitazawa        13,650
19     Ms.     suzuki       7     shimokitazawa        13,650
20     Ms.     suzuki       8     shimokitazawa        13,650
21     Ms.     suzuki       9     shimokitazawa        13,650
22     Ms.     suzuki      10     shimokitazawa        13,650
23     Ms.     suzuki      11     shimokitazawa        13,650
24     Ms.     suzuki      12     shimokitazawa        13,650
---                                              ----------
ID                                                 163,800
ID=003
OBS    title     name      month    station       expense
25     Mr.     takahashi       1     funabashi         17,800
26     Mr.     takahashi       2     funabashi         17,800
27     Mr.     takahashi       3     funabashi         17,800
28     Mr.     takahashi       4     funabashi         17,800
29     Mr.     takahashi       5     funabashi         17,800
30     Mr.     takahashi       6     funabashi         17,800
31     Mr.     takahashi       7     funabashi         17,800
32     Mr.     takahashi       8     funabashi         17,800
33     Mr.     takahashi       9     funabashi         17,800
34     Mr.     takahashi      10     funabashi         17,800
35     Mr.     takahashi      11     funabashi         17,800
36     Mr.     takahashi      12     funabashi         17,800
---                                            ----------
ID                                               213,600
ID=004
OBS    title      name      month     station        expense
37     Mr.     tanaka       4     yokohama        15,830
38     Mr.     tanaka       5     yokohama        15,830
39     Mr.     tanaka       6     yokohama        15,830
40     Mr.     tanaka       7     yokohama        15,830
41     Mr.     tanaka       8     yokohama        15,830
42     Mr.     tanaka       9     yokohama        15,830
43     Mr.     tanaka      10     yokohama        15,830
44     Mr.     tanaka      11     yokohama        15,830
45     Mr.     tanaka      12     yokohama        15,830
---                                                   ----------
ID                                                      142,470
                                                      ==========
                                                        593,790

インフォーマット?
代入文?
演算子
関数・コールルーチン
フォーマット?
データセットオプション

質問・意見

サマリ 質問の要旨を簡潔にお願いします。
お名前
状態
メッセージ

質問・意見一覧

状態
↑(1)
サマリ投稿者ページ名[_past]
edit/refer
制御文の項目についてanonymous?SAS入門3/21469659692

以下は、SASのエディタWINDOWでコピペして使えます

/*
変数の加工について概要を説明します
*/


options nocenter compress=yes;
libname mydata "c;\";

/*
割り当て文(代入文)
変数には,通常のプログラム言語と同じような書き方で,
定数や別の変数から得られた値を代入することができます.
変数=(定数や変数と演算子や関数からなる計算式)
*/


data sample;
  format ID Z3.;
  informat name $10.;
  informat sex $1.;
  informat station $10.;
  informat expense comma10.;
  format expense comma10.;
  input ID name $ sex $ station $ expense;

  annual=expense*12;                /*expenseの12倍を変数annualに与える*/
  tax=int(annual*0.05);             /*annualの5%の1円未満切捨てを変数taxに与える*/
  fromto="tokyo"||"<->"||station;/*tokyo<->最寄り駅の文字列を変数fromtoに与える*/


cards;
001 fujita M iidabashi  6,160
002 suzuki F shimokitazawa  13,650
003 takahashi  M funabashi    17,800
004 tanaka M yokohama 15,830
;

proc print;run;



/*
OBS     ID      name      sex    station         expense    annual     tax            fromto

 1     001    fujita     M     iidabashi         6,160     73920     3696    tokyo<->iidabashi
 2     002    suzuki     F     shimokitazawa         13,650    163800     8190    tokyo<->shimokitazawa
 3     003    takahashi      M     funabashi           17,800    213600    10680    tokyo<->funabashi
 4     004    tanaka     M     yokohama        15,830    189960     9498    tokyo<->yokohama

ここで使われたのは,
積の演算子(*)と,文字列の連結の演算子(||),整数化する関数int()です.
もちろん,参照した変数自体に代入することで,元の変数の値を変更することもできます.

演算子には,加減乗除(+,=,*,/)とべき乗(**)といった算術演算子
AND(&),OR(|),NOT(^),XORといった論理演算子
LT(<),LE(<=),GT(>),GE(=>),EQ(=),NE(^=)といった比較演算子
文字データに対しては,連結(||),前方一致(=:)などはすぐに使えると思います.

関数には,
数値に対するものと,文字に対するものがあります.以下のヘルプから
全体を把握するといいでしょう.

ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >関数とcallルーチン>カテゴリ別の関数とcallルーチン
*/

/*
制御文
他のプログラム言語同様,IF THEN ELSE,DO,DO WHILE などの処理の流れを制御することができます.
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>
の中のIF,IF-THEN/ELSE,DO/END,DO,DO UNTILE,DO WHILE,WHEN/SELECTステートメント
*/

data sample;
  format ID Z3.;
  informat name $10.;
  informat sex $1.;
  informat station $10.;
  informat expense comma10.;
  format expense comma10.;
  input ID name $ sex $ station $ expense;

  if      sex="M" then title="Mr."; /*男にはMr.女にはMs.をつける*/
  else if sex="F" then title="Ms.";
  else                 title=.;

  do month=1 to 12;                           /*各自,1月から12月までの定期代の予算データを起こす*/
    if name=:"iga" and month in (1,2,3) then ; /*ただしigaのみ4月からとする*/
    else output;                                /*outputは,obsを生成することを明示的に指示*/
  end;

cards;
001 fujita M iidabashi  6,160
002 suzuki F shimokitazawa  13,650
003 takahashi  M funabashi    17,800
004 tanaka M yokohama 15,830
;

proc print;
by ID;                                   /*by文 ID毎に分けて印字*/
var title name month station expense;    /*var文 印刷する変数とその順序を明示*/
sum expense;                             /*sum文 合計を印字*/
run;

/*
print文にも,いくつかオプションを指定しましたので,以下のように出力されます.

ID=001

OBS    title      name      month     station        expense

  1     Mr.     fujita       1     iidabashi         6,160
  2     Mr.     fujita       2     iidabashi         6,160
  3     Mr.     fujita       3     iidabashi         6,160
  4     Mr.     fujita       4     iidabashi         6,160
  5     Mr.     fujita       5     iidabashi         6,160
  6     Mr.     fujita       6     iidabashi         6,160
  7     Mr.     fujita       7     iidabashi         6,160
  8     Mr.     fujita       8     iidabashi         6,160
  9     Mr.     fujita       9     iidabashi         6,160
 10     Mr.     fujita      10     iidabashi         6,160
 11     Mr.     fujita      11     iidabashi         6,160
 12     Mr.     fujita      12     iidabashi         6,160
---                                               ----------
 ID                                                   73,920


ID=002

OBS    title      name      month    station        expense

 13     Ms.     suzuki       1     shimokitazawa        13,650
 14     Ms.     suzuki       2     shimokitazawa        13,650
 15     Ms.     suzuki       3     shimokitazawa        13,650
 16     Ms.     suzuki       4     shimokitazawa        13,650
 17     Ms.     suzuki       5     shimokitazawa        13,650
 18     Ms.     suzuki       6     shimokitazawa        13,650
 19     Ms.     suzuki       7     shimokitazawa        13,650
 20     Ms.     suzuki       8     shimokitazawa        13,650
 21     Ms.     suzuki       9     shimokitazawa        13,650
 22     Ms.     suzuki      10     shimokitazawa        13,650
 23     Ms.     suzuki      11     shimokitazawa        13,650
 24     Ms.     suzuki      12     shimokitazawa        13,650
---                                              ----------
 ID                                                 163,800


ID=003

OBS    title     name      month    station       expense

 25     Mr.     takahashi       1     funabashi         17,800
 26     Mr.     takahashi       2     funabashi         17,800
 27     Mr.     takahashi       3     funabashi         17,800
 28     Mr.     takahashi       4     funabashi         17,800
 29     Mr.     takahashi       5     funabashi         17,800
 30     Mr.     takahashi       6     funabashi         17,800
 31     Mr.     takahashi       7     funabashi         17,800
 32     Mr.     takahashi       8     funabashi         17,800
 33     Mr.     takahashi       9     funabashi         17,800
 34     Mr.     takahashi      10     funabashi         17,800
 35     Mr.     takahashi      11     funabashi         17,800
 36     Mr.     takahashi      12     funabashi         17,800
---                                            ----------
 ID                                               213,600


ID=004

OBS    title      name      month     station        expense

 37     Mr.     tanaka       4     yokohama        15,830
 38     Mr.     tanaka       5     yokohama        15,830
 39     Mr.     tanaka       6     yokohama        15,830
 40     Mr.     tanaka       7     yokohama        15,830
 41     Mr.     tanaka       8     yokohama        15,830
 42     Mr.     tanaka       9     yokohama        15,830
 43     Mr.     tanaka      10     yokohama        15,830
 44     Mr.     tanaka      11     yokohama        15,830
 45     Mr.     tanaka      12     yokohama        15,830
---                                               ----------
 ID                                                  142,470
                                                  ==========
                                                     593,790
*/



/*

インフォーマット
代入文
演算子
関数
フォーマット
データセットオプション
*/


*****************************************************************
END
*****************************************************************;