Study SAS

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

SAS Base Programmer 練習問題14

次のSASプログラムをサブミットしたときにRESULTデータセットに格納される変数について正しい記述はどれか

data result;
    dd = '01JAN60'd;
    year1 = year(dd);
    month1 = month(dd);
    day1 = day(dd);
run;

A. year1, month1, day1はいずれも文字列データである。
B. month1は文字列データ、year1, day1は数値データである。
C. year1, day1は文字列データ、month1は数値データである。
D. year1, month1, day1はいずれも数値データである。


答え: D (要反転)

関数year(), month(), day()の返却値はいずれも数値データである。
RESULTデータセットには以下のような値が入っている。

dd year1 month1 day1
0 1960 1 1

SAS Base Programmer 練習問題13

次のSASプログラムをサブミットしたとき、WORK.RETAILの変数totalの値はどれになるか

data work.retail;
    cost = '$20,000';
    total = .10 * cost;
run;

A. 2000
B. ‘2000’
C. . (数値データの欠損値)
D. ‘ ‘(文字データの欠損値)


答え: C (要反転)

SAS Base Programmer 練習問題11の類似問題。$表現やカンマ区切り表現の場合は暗黙の変換が行われないためエラーとなる。乗算結果として数値データの欠損値が返される。正しく演算を行うにはinput関数を使用して明示的に数値データに変換する必要がある。

data work.retail;
    cost = input('$20,000', dollar7.);
    total = .10 * cost;
run;

はてなブログでのSASコードのシンタックスハイライト

はてなブログではスーパーpre記法という書き方をすると
プログラムのソースコードにシンタックスハイライトを適用して表示することができる。

ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ

例えば、C言語では

 >|c|
 #include<stdio.h>

 int main(int argc, char* argv[])
 {
     printf("Hello World !\n"); /* Comment */

     return 0;
 }
 ||<

と書くと

#include<stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello World !\n"); /* Comment */

    return 0;
}

のようにキーワードに色付けして表示される。
上記のヘルプページの対応ファイルタイプの中にSASがあった(記事執筆時点では無くなっている)ので、試してみたところ

 >|sas|
 %put _user_;

 data work.test;
     set work.test2;
     msg = 'Hello World !'; /* comment */
 run; 

 proc contents data=work._all_ nods;
 run;
 ||<

のように書いて、

%put _user_;

data work.test;
    set work.test2;
    msg = 'Hello World !'; /* comment */
run; 

proc contents data=work._all_ nods;
run;

うまくハイライトできていないみたい。
サポートにお問い合わせしたところ、対応困難とのこと。
SASのコードを掲載する人なんてめったにいないので仕方ないのか。

SAS Base Programmer 練習問題12

次のODSステートメントのターゲットのうち、Excelで読み込み可能なファイルを出力するものとして誤っているのはどれか

A. targets.ExcelXP
B. msoffice2k
C. csvall
D. winxp


答え: D (要反転)

csvallはcsvファイルを出力するターゲット。Excelまたはテキストエディタで開くことができる。ODSステートメントwinxpというターゲットは存在しない。


(2014/03/14 OSD -> ODSに修正)

マルチバイト文字を含む文字列の文字数カウント

日本語を含む文字列に対してlength関数を使用すると、日本語文字が2文字分としてカウントされる。

data temp;
    input text $32.;
    infile datalines truncover;
    text_len = length(text);
    datalines;
ABCDE
あいうえお
あ い う
あ い う え お
あいうabcかきく
    ;
run;
text text_len
ABCDE 5
あいうえお 10
あ い う 10
あ い う え お 14
あいうabcかきく 15


日本語を含む文字列の場合、2バイト文字に対応したklength関数を使う

data temp;
    input text $32.;
    infile datalines truncover;
    text_len = klength(text);
    datalines;
ABCDE
あいうえお
あ い う
あ い う え お
あいうabcかきく
    ;
run;
text text_len
ABCDE 5
あいうえお 5
あ い う 5
あ い う え お 9
あいうabcかきく 9

SAS Base Programmer 練習問題11

次のSASプログラムをサブミットしたとき、WORK.RETAILの変数totalの値はどれになるか

data work.retail;
    cost = '20000';
    total = .10 * cost;
run;

A. 2000
B. ‘2000’
C. . (数値データの欠損値)
D. ‘ ‘(文字データの欠損値)

出典はこちら


答え: A (要反転)

型変換の問題。文字データ'20000'はtotalの計算時に数値データに自動で変換される。なお、.10は数値データの0.10。

row, columnの覚え方

行列のそしてrowcolumn、どっちが縦でどっちが横か。
行と列の覚え方は
Excelの「行」と「列」を混同せずに覚えるコツが話題に - NAVER まとめ
などにまとめられているが、rowとcolumnの覚え方に関するページがないか
探していたところ以下のページを発見したのでご紹介。

ひと目でわかる行列(Row ・ Column)の方向の覚え方 - Λlisue's blog

分かりやすいイラストをCreative Commonsライセンスで配布されていたので転載させていただきました。

f:id:uetmk0930:20140227165658p:plain

おしゃれなデザインなのでPCの壁紙にもできそう。