SAS Base Programmer 練習問題24
| capacity | airplanetype | staff |
|---|---|---|
| 150 | Large | 10 |
A.
data work.test
capacity = 150;
if 100 le capacity le 200 then
airplanetype = 'Large' and staff = 10;
else
airplanetype = 'Small' and staff = 5;
run;B.
data work.test;
capacity = 150;
if 100 le capacity le 200 then do;
airplanetype = 'Large';
staff= 10;
end;
else do;
airplanetype = 'Small';
staff = 5;
end;
run;C.
data work.test;
capacity = 150;
if 100 le capacity le 200 then do;
airplanetype = 'Large';
staff = 10;
else do;
airplanetype = 'Small';
staff = 5;
end;
run;D.
data work.test;D.data work.test;
capacity = 150;
if 100 le capacity le 200 then;
airplanetype = 'Small';
staff = 5;
else;
airplanetype = 'Large';
staff = 10;
run;出典はこちら
答え: B (要反転)
B以外はシンタックスエラーとなる。IF-ELSEブロック内で複数のステートメントを実行する場合はDO-ENDで括る必要がある。
SAS Base Programmer 練習問題23
次のSASプログラムをサブミットする
data work.staff;
JobCategory = 'FA';
JobLevel = '1';
Jobcategory = Jobcategory || JobLevel;
run;出力データセットの変数JOBCATEGORYの値は以下のどれか
A. FA
B. FA1
C. FA 1
D. '' (文字データの欠損値)
出典はこちら
答え: A (要反転)
||は文字列同士を結合する演算子だが、JobCategoryは JobCategory = 'FA'; とした時点で長さは2バイトとなる。そのため、結合しても文字列は'FA'のままとなる。
以下のようにJobCategoryの長さを大きくすれば解決するように思えるが、
data work.staff;
length JobCategory $ 8;
JobCategory = 'FA';
JobLevel = '1';
Jobcategory = Jobcategory || JobLevel;
run;このコードの実行結果のJobCategoryもFAとなる。
結合結果を別の変数Jobcategory2に代入してみると
data work.staff;
length JobCategory $ 8;
JobCategory = 'FA';
JobLevel = '1';
Jobcategory2 = Jobcategory || JobLevel;
run;
| Jobcategory | JobLevel | Jobcategory2 |
|---|---|---|
| FA | 1 | FA 1 |
FAの末尾に空白文字が6文字分入っているためであることが分かる。
FA1の結果を得るためには、以下のようにtrimを使って空白を除去する必要がある。
data work.staff;
length JobCategory $ 8;
JobCategory = 'FA';
JobLevel = '1';
Jobcategory = trim(Jobcategory) || JobLevel;
run;
SAS Base Programmer 練習問題22
次のSASプログラムをサブミットする
data work.new;
length word $7;
amount = 4;
if amount = 4 then word = 'FOUR';
else if amount = 7 then word = 'SEVEN';
else word = 'NONE!!!';
amount = 7;
run;変数WORDおよび変数AMOUNTの値は以下のどれか
A.
| word | amount |
|---|---|
| FOUR | 7 |
B.
| word | amount |
|---|---|
| FOUR | 4 |
C.
| word | amount |
|---|---|
| SEVEN | 4 |
D.
| word | amount |
|---|---|
| NONE!!! | 4 |
出典はこちら
答え: A (要反転)
IF-ELSEなど基本的な文法の知識で正解できる問題
SAS Base Programmer 練習問題21
100個のレコードを含む生データファイルを読み込む以下のSASプログラムについて
data work.total;
infile 'file-specification' end = eof;
input name $ salary;
totsal + salary;
<insert IF statement here>;
run;最後のオブザーベーションをデータセットに出力するIFステートメントは以下のどれか
A. if end = 0;
B. if eof = 0;
C. if end = 1;
D. if eof = 1;
出典はこちら
答え: D (要反転)
infile 'file_path' end = <変数名>;
上記のようにendオプションの引数として変数を設定すると(eofという名前にする必要はない)、最後のオブザーベーションを読み込んだ時に設定した変数に1が、それ以外のオブザーベーションでは0が格納される。したがってeofが1のときにデータセットに出力されるようなステートメントとする。
SAS Base Programmer 練習問題20
次のSASプログラムをサブミットする
data work.flights;
destination = 'CPH';
select(destination);
when('LHR') city = 'London';
when('CPH') city = 'Copenhagen';
otherwise;
end;
run;変数CITYの値は以下のどれか
A. London
B. Copenh
C. Copenhagen
D. '' (文字データの欠損値)
出典はこちら
答え: B (要反転)
lengthステートメントで定義していない場合、文字変数の長さは最初に代入の処理が記述された文字列の長さとなる。ポイントは実行される、されないに関係なく、コード的に上の行に書かれているものが優先される。したがって city = 'London'; の方が先に出てくるため、cityの長さは6バイトとなり、'Copenhagen'の先頭6文字の'Copenh'がcityに格納されることになる。
仮に、さらに上の行で10文字以上の文字列をcityに割り当てるコードが書かれていたとしたら、
data work.flights;
destination = 'CPH';
select(destination);
when('RDJ') city = 'Rio de Janeiro';
when('LHR') city = 'London';
when('CPH') city = 'Copenhagen';
otherwise;
end;
run;cityの値は'Copenhagen'となる。