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
インフォーマット?
代入文?
演算子
関数・コールルーチン
フォーマット?
データセットオプション
質問・意見
質問・意見一覧
以下は、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
*****************************************************************;