投稿

[SAS]はじめてのSAS University Edition on AWS

イメージ
最近、AWSを使う機会が増えてきたので、SAS University Edition のAWS版を使ってみました。使うに至る前に、EC2インスタンス作成から SAS Studioの起動まで、初見ではなかなか難しいと感じたので記事にしてみました。 (本記事のスクリーンショットは、記事作成時点でのものです。現在の画面と異なる場合がありますので、ご了承ください。) AWSアカウントを作成する 公式の「 AWSアカウント作成の流れ 」を参考にアカウントを作成。 1年間の無料枠しか使うつもりがなくても、クレジットカードの登録が必要です。 AWSコンソールにログイン後、リージョンを変更 AWSサービスの作成場所(リージョン)がデフォルトではアメリカになっております。右上から、「アジアパシフィック(東京)」に変更しましょう。 EC2インスタンス(SAS University Edition)を作成 SAS University Editionを使うためには、専用の EC2インスタンスを作る必要があります。 左上の「サービス」から「EC2」を選択します。 「インスタンスの作成」ボタンをクリック。 左の選択肢から、「AWS Marketplace」を選択。検索ボックスで「sas」を入力すると、「SAS University Edition」が出てきます。検索結果に出てきたら、画面右側の「選択」ボタンをクリックします。 「選択」ボタンをクリック後、SAS University Editionの概要やインスタンスタイプごとの料金が表示されます。インスタンスタイプt2.microであれば、1年間の無料枠の範囲内です。それ以外だと、有料になります。現在、一番高い「t2.midium」で、$0.061/時間です。エアコンを1時間使ったときの電気代といい勝負ですね。 「Continue」ボタンをクリック後、インスタンスタイプを指定します。今回は、無料枠の「t2.micro」を選択します。 EBSの容量やセキュリティグループなどの設定がありますが、今回はデフォルトのままにしておいて、右下の「確認と作成」ボタンをクリックします。キーペアないぞ、と言われるので、キーペアなしで作成します。 「インスタン

マクロの引数にカンマ、クォートなどを渡す : %bquote, %str, %superq - SAS

%bquote , %str などを用いて、マクロの引数に、カンマ、クォートといった記号を渡す方法です。何度か質問されたので、まとめてみます。 まずはサンプル用のマクロとして、マクロの引数に渡った値をログに出力するだけの単純なマクロを作ります。 %macro TEST(ARGS) ; %put &=ARGS. ; %mend TEST ; まずは失敗例。下記のように、カンマやダブルクォーテーションを引数として渡そうとしてみます。しかし、カンマを付けてしまうと、"1"が 1つ目の引数の値、"2"が 2つ目の引数の値としてみなされてしまいます。マクロ定義の引数より多く引数を渡したと言われ、ERROR になってしまいます。 実行ログ 67 %TEST("1", "2") ; ERROR: マクロに定義された数よりも多い定位置パラメータが与えられています。 68 カンマやダブルクォーテーションを渡すためには、%bquote あるいは %str を使うことで、渡すことができます。 %str は、ダブルクォーテーションの前に % を書かないといけないので、少々面倒ですね。 実行ログ 69 %TEST(%bquote("1", "2")) ; ARGS="1", "2" 70 71 %TEST(%str(%"1%", %"2%")) ; ARGS="1", "2" また、引数をマクロ変数にて、渡したい場合は %bquote を使うことでできます。%str だと渡すことができません。 実行ログ 61 %let ARGS = "1", "2" ; 62 %TEST(%bquote(&ARGS.)) ; ARGS="1", "2" 63

マクロ %if とデータステップ if ステートメントで、●● < ▲▲ < ★★ の動作が異なる

SASのデータステップでは、if の条件分岐にて、if ●● < ▲▲ < ★★ ; という書き方をすることができます。 どのように動作するかというと、以下のように動きます。 まず、●● < ▲▲ が評価されます。 つぎに、▲▲ < ★★ が評価されます。 書いている通り、数学で出てくる条件文みたいな動作をしてくれます。他の言語だとあまり見ない動きです。 では、データステップ以外の条件分岐、マクロの %if でも同じ動作をしてくれるかというと、そんなことはない、というのが今回のお話です。 マクロ %if にて、同じように %if ●● < ▲▲ < ★★ ~ と記載すると、どんな動きをするのか。 まず、●● < ▲▲ が評価されます。(ここは同じ) つぎに、直前の評価結果(falseなら 0 , trueなら 1) < ★★ が評価されます。 こちらの動きの方が他の言語でよく見る論理式の動きではないでしょうか。 2つ目の処理の仕方が違うので、一見して同じような書き方でも、データステップとは処理結果が異なることになります。 この動きの違いがどんなことを起こすのか。試しに、データステップ、マクロのサンプルコードを作ってみましょう。 62 /* データステップの例 */ 63 data _null_ ; 64 if 10 < 20 < 30 then putlog "TRUE" ; else putlog "FALSE" ; 65 if 10 < 20 < 10 then putlog "TRUE" ; else putlog "FALSE" ; 66 if 10 < 20 = 1 then putlog "TRUE" ; else putlog "FALSE" ; 67 if 20 < 10 = 0 then putlog "TRUE" ; else putlog

ユーティリティファイルのサイズを調べたい : sort プロシジャ details オプション - unix版SAS限定?

sortプロシジャは、実行しているとき、ユーティリティファイルという一時ファイルを作成します。そのファイルの中でソート処理が行われるわけですが、ユーティリティファイルの容量は、ソート対象のデータセットの 1~3倍くらい?のサイズになります。どのくらいのサイズになるかは、データセットがどのような構造をしているかなどで上下します。ユーティリティファイルは、ソートの終了とともに消えてしまうので、サイズを調べるのは少々面倒です。 sortプロシジャの details オプションは、ユーティリティファイルのサイズをログに出力してくれるオプションです。このオプションをつけることで、簡単にサイズがわかります。どんな風に出力してくれるかを見てみましょう。 71 option msglevel=i lognumberformat ; 72 73 proc sort data=TEST details ; 74 by R ; 75 run ; NOTE: ユーティリティファイルが必要です。 NOTE: ユーティリティファイル 1 のページサイズは 131072 バイトです。 NOTE: データセットWORK.TESTから100,000,000オブザベーションを読み込みました。 NOTE: ユーティリティファイル 1 には 100000000 レコードと 3 並べ替えられた実行が含まれます。 NOTE: ユーティリティファイル 1 は 30527 ページ (合計 3907456.00 KB) あります。 NOTE: SASスレッドソートを使用します。 NOTE: データセットWORK.TESTは100,000,000オブザベーション、3変数です。 NOTE: PROCEDURE SORT処理(合計処理時間): 処理時間 1:16.55 ユーザーCPU時間 1:20.44 システムCPU時間 7.35 秒 メモリ 3165715.60k OSメモリ 3193028.00k タイムスタンプ 201

SAS 入力方式 $CHARw. VS $w.

入力方式 $CHARw. と $w. は文字を取り込むときに使う入力方式です(w には変数の長さが入ります)。 同じ意味の入力方式かと思いきや、少し動作が異なります。 $CHARw. は、一文字のドット . をきちんと読み込みますが、$w. は読み込まず欠損値となります。 また、頭と末に空白があった場合の動作も、若干異なります。 $CHARw. と $w. の動作の違いを確かめるテストコード data TEST ; infile cards dlm="," dsd missover ; input STR_1 : $char10. STR_2 : $10. ; LEN_1 = length(STR_1) ; LEN_2 = length(STR_2) ; cards ; ABC,DEF .,. ..,.. BC, EF "BC ","EF " " A B C "," D E F " ; run ; proc print data=TEST ; run ; OBS STR_1 STR_2 LEN_1 LEN_2 1 ABC DEF 3 3 2 . 1 1 3 .. .. 2 2 4 BC EF 3 2 5 BC EF 2 2 6 A B C D E F 6 5 一文字のドットがある場合、$CHARw. はそのまま取り込めているのがわかります。$w. は欠損値となっています。 頭と末の空白については、見た目上はわからないですが、length 関数の値が異なる場合があるのがわかります。どうやら、先頭の空白の有無で違いが現れているようで、末の空白は違いがないようです。(ただし、頭と末の空白の扱い方は、

proc format - SAS日時、SAS日付、SAS時間に対して、自分で出力方式を作成する

すごく久しぶりに、proc format で出力方式を作ったら、完全にど忘れして同じ失敗を繰り返してしまったので、忘れないために記事書きます。 SAS日時、SAS日付、SAS時間の出力方式って、いっぱいありますけど、たくさんある出力方式を探すの大変だし、探してみたらほしいものが無かったなんてことがまれによくあります。 そんなときに使うのが、proc format です。出力方式を自分で作ることができます。 数値や文字に対しても、出力方式を作ることもできますが、今回は、SAS日時、SAS日付、SAS時間について、出力方式を作ってみたいと思います。 proc format ; /* YYYY-MM-DD HH:MI:SS 形式 */ picture YMDHMS_A other='%Y-%0m-%0D %0H:%0M:%0S' (datatype=datetime) ; /* %a で曜日も入れられます。local によって結果は異なります */ picture YMDHMS_B other='%Y%0m%0D(%a) %0H%0M%0S' (datatype=datetime) ; /* 日本語も入れることができます */ picture YMDHMS_C other='%Y年%0m月%0D日(%a曜日) %0H時%0M分%0S秒' (datatype=datetime) ; /* ゼロを無くすことで、セロ埋めされずに出力されます */ picture YMDHMS_D other='%Y-%m-%D %H:%M:%S.%s' (datatype=datetime) ; run ; /* 作成した出力方式を使ってみる */ data _null_ ; DATM = datetime() ; putlog DATM= YMDHMS_A19. ; putlog DATM= YMDHMS_B20. ; putlog DATM= YMDHMS_C44. ; putlog DATM= YMDHMS_D24. ; run ; picture ステートメントの直後に、好きな出力方式名を指定します。 値に応じて、出力方式を変

FedSQL プロシジャは、SQLプロシジャとどう違うの? - SAS

イメージ
データステップ100万回 SAS新手一生 さんにて、「 PROC SQL では LIMIT 句が使えない けどPROC FEDSQLでは使えるよ。ついでにOFFSET句も。の話 」を読んで、SQLプロシジャと FedSQL ってなにが違うんだろ、と疑問に思ったので少し調べてみました。そもそも、FedSQLプロシジャの存在すら知らない(汗。 そんなこんなで、個人的に気になったところを簡単にピックアップしてみます。 FedSQLプロシジャ とは? FedSQLプロシジャは、新しいデータタイプに対応し、(SAS9.4の時点で) ANSI SQL:1999 に準拠したSQL を記載することができます。 FesSQLプロシジャが準拠している ANSI SQL:1999 ですが、それ以降の ANSI SQL はもちろん準拠していません。例えば、ANSI SQL:2003 で追加になったウィンドウ関数 partition by などは残念ながらないです。 悲しい。 FedSQL の Fed は、たぶん、federal (連邦の) か federation (連邦政府) の略ですかね、、、知ってる方がいらっしゃたら教えて下さい。。。 一方、SQLプロシジャでは完全にANSIに準拠しているわけではなく、もともとのSASの動きぽいところと互換性をもたせています。ですので、OracleやらDB2を使っていた人からすると、違和感があるような記載方法や動作をしたりすることがあります。 では、FedSQLプロシジャとSQLプロシジャでどこが違うのか見ていきましょう。 null (欠損値) の扱い方 - マイナス無限 SAS忘備録 さんの「 SQLプロシジャ入門15:NULLの取扱い 」にて記載されていますが、DATAステップも含めて、SQLプロシジャでは、欠損値はマイナス無限みたいな扱いになっています。例えば、where句 で A < 10 みたいに絞り込みを実施すると、通常のSQLでは 欠損値は条件の対象外ですが、SQLプロシジャやDATAステップでは欠損値も含んでしまいます。 FedSQLプロシジャに、ansimodeオプションを付けると、ANSI準拠の動きになり、where句 で A < 10 みたいに絞り込みを実施したとき、欠損値を