Study SAS

統計解析ソフトウェアSASについて学習したことのまとめやSAS認定試験対策など

SAS Base Programmer 練習問題26

以下の生データレコードがある

07Jan2002

このデータを読み込むために指定するフォーマットはどれか

A. date9.
B. dmonyy9.
C. ddMMMyy9.
D. ddmmmyyyy9.

出典はこちら


答え: A (要反転)

B, C, Dのような入力フォーマットは存在しない

入力フォーマットはINFORMATステートメントで指定する

data datedata;
    input birthday;
    informat birthday date9.;
    datalines;
07Jan2002
    ;
run;

SAS Base Programmer 練習問題25

次のSASプログラムをサブミットする

proc sort data=sasuser.houses out=report;
    by style;
run;

出力データセットはどのライブラリ内に作成されるか

A. WORK
B. REPORT
C. HOUSE
D. SASUSER

出典はこちら


答え: A (要反転)

outオプションで出力先のライブラリおよびデータセット名を指定する。WORK.REPORT(ライブラリ: WORK, データセット: REPORT)が作成される。outを指定しない場合、データセットが上書きされるので注意。

SAS Base Programmer 練習問題24

以下の内容のSASデータセットWORK.TESTがある。

capacity airplanetype staff
150 Large 10

このデータセットを出力するSASプログラムは以下のどれか

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'となる。