SAS Base Programmer 練習問題17
次のSASプログラムをサブミットする
data work.total; set work.salary(keep = department wagerate); by department; if first.department then payroll = 0; payroll + wagerate; if last.department; run;
SASデータセットWORK.SALARYには5つのdepartmentのデータが100オブザーベーションずつ含まれ、変数DEPARTMENTでソートされている。
WORK.TOTALデータセットにはいくつのオブザーベーションが格納されているか
A. 5
B. 20
C. 100
D. 500
出典はこちら
答え: A (要反転)
byステートメントを使用してグループ(department)ごとに合計を算出している。5つのdepartmentがあるため、オブザーベーション数は5つとなる。
byステートメントの使い方はこちらを参照。
5つのdepartmentのソート済みデータは例えば以下のようなデータセット
data salary; department = 'A'; wagerate = 1000; output; department = 'A'; wagerate = 2000; output; department = 'A'; wagerate = 3000; output; department = 'B'; wagerate = 4000; output; department = 'B'; wagerate = 5000; output; department = 'C'; wagerate = 6000; output; department = 'C'; wagerate = 7000; output; department = 'C'; wagerate = 8000; output; department = 'D'; wagerate = 9000; output; department = 'D'; wagerate = 10000; output; department = 'D'; wagerate = 11000; output; department = 'D'; wagerate = 12000; output; department = 'E'; wagerate = 13000; output; department = 'E'; wagerate = 14000; output; department = 'E'; wagerate = 15000; output; run;
Obs | department | wagerate |
---|---|---|
1 | A | 1000 |
2 | A | 2000 |
3 | A | 3000 |
4 | B | 4000 |
5 | B | 5000 |
6 | C | 6000 |
7 | C | 7000 |
8 | C | 8000 |
9 | D | 9000 |
10 | D | 10000 |
11 | D | 11000 |
12 | D | 12000 |
13 | E | 13000 |
14 | E | 14000 |
15 | E | 15000 |
このデータセットを入力として下記のコードを実行する。
data total; set salary(keep = department wagerate); by department; if first.department then payroll = 0; payroll + wagerate; if last.department; run;
各departmentの最初のオブザーベーションで合計値を格納する変数payrollに0を代入、最後のオブザーベーションのときにデータセットに出力するようになっている。
Obs | department | payroll |
---|---|---|
1 | A | 6000 |
2 | B | 9000 |
3 | C | 21000 |
4 | D | 42000 |
5 | E | 42000 |
データセットTOTALにはdepartmentごとのwagerateの合計値が格納されている。