2006年7月26日水曜日

NECのモバイルプロジェクタ購入


この度NIでは、NECのモバイルプロジェクタ「LT35J」を購入しました。



f:id:n-insight:20061225174322j:image


f:id:n-insight:20061225174310j:image



高性能で持ち運びも容易なのでとても重宝しています。


値段もそれなりにしましたが・・・。




月1回行われる社内での定例会や、プレゼン等で利用しています。


たまには社内でDVD鑑賞なんてのもいいですね。


2006年7月23日日曜日

DELLの高性能ノートブック購入


NIでは、DELL社の高性能ノートブックを3台購入しました。


製品名はInspiron 9400です。



f:id:n-insight:20061222173555j:image


f:id:n-insight:20061222173554j:image



現在、3台ともにSAS社「Enterprise Guide」を導入し、


1台は「SAS Enterprise BI Server」として稼動しています。



社内で、BI構築ノウハウの研究社員の研修に役立てています。




2006年7月17日月曜日

変数名の略記方法


Tipsと呼ぶほど大したものではありませんが、結構便利な使い方です。



まず、変数名の略記方法ですが、


例えばvar1、var2、var3という変数がある場合にそのすべてを指定する記述は、var1-var3という方法があります。


また、var:でも可です。(ただし、var5とかvariable1という変数があればそれも対象になります。)



ここでは、var:の略記方法を使った例を挙げます。



INFILEステートメントで外部ファイルを読み込む場合、


最終的には外部ファイルの項目をすべてデータセットに出力する必要がないときがあります。


読み込んだ項目によって新しく変数を作成したり、レコード抽出のためだけに必要な項目がある場合です。


このようなとき、最終的にデータセットに出力する必要がない項目を格納する変数には、"_"のような共通の接頭語を付けておきます。



data dat1(drop=_:) ;


 infile "D:\\inputdat1.csv" dsd missover firstobs=2 ;


 input key1 key2 _key3 _var1 _var2 var3 var4 var5 _var6 _var7 ;


 if _var1 and _var2 ;


 key3 = put(_key3,z8.) ;


 var8 = _var6 + _var7 ;


run ;



こうしておくことで「data dat1(drop=_:) ;」という記述が可能になり、


dat1というデータセットにはkey1、key2、key3、var3、var4、var5、var8の変数のみが出力されます。


この例程度の項目数であれば、あまり利便性は感じられないかもしれません。



また、保持する項目は明示的にKEEPステートメントで指定するというルールでコーディングする場合もあるかもしれません。


使い分ける判断力は必要かと思いますが、覚えておいても損はしないでしょう。


2006年7月14日金曜日

前0付き値のマクロ変数設定方法


%DOループ内でインデックス的な前0付きのマクロ変数を定義する方法です。



%do i=1 %to 100 ;


 %let idx=%substr(%eval(&i+1000),2) ;


%end ;




DATAステップを使用してzN.フォーマットで変換した値をCALL SYMPUTルーチンでマクロ変数に設定する方法が一般的ですが、


上記の方法だとDATAステップを使用せずに前0付きの値をマクロ変数に設定できます。



%DOループ内でdat001~dat100というようなSASデータセット名や、var001~var100というような変数名を作るときなどに便利です。


2006年7月1日土曜日

オブザベーション数をマクロ変数として取得する方法



SASでプログラミングをする際、
任意のSASデータセットのオブザベーション数を取得したい場合がよくあります。

いろいろと手法はあると思いますが、
ここでは以下3つの方法を紹介します。

オブザベーション数を取得するSASデータセットは、
下記『temp.sas7bdat』とします。

 f:id:n-insight:20070302235244g:image


 ①SETステートメントの「NOBS=」オプションを使用する場合

 data _NULL_ ;

  set temp nobs=obs ;

  call symput("TOTAL_OBS1", obs) ;

  stop ;

 run ;

これが一番普通の手法でしょうか。

NOBS=の後に記述したSAS名(ここではobs)に、
SETしたSASデータセットのオブザベーション数が入ります。

あとは、CALL SYMPUTルーチンでマクロ変数を定義するだけです。

実行結果は下記の通りです。

 f:id:n-insight:20070302235330g:image



 ②SQLプロシジャを使用する場合

 proc sql noprint ;

  select count(*) into: TOTAL_OBS2

  from temp ;

 quit ;

まず、count()はSQLの関数です。


「count(変数名)」のように変数を引数に与えることもできますが、
引数で指定した変数に欠損値またはブランクがある場合、
そのオブザベーション(行)をカウントしてくれません。
(もちろん、それを理解したうえで使う場合もありますが…)

そのため、このような場合ではcount(*)と記述します。

次に、count(*)の戻り値をマクロ変数として定義するために、
「into: マクロ変数名」というかたちで記述します。


実行結果は下記の通りです。

 f:id:n-insight:20070302235352g:image


 ③マクロ関数%SYSFUNCでSCL関数を使用する方法

 %let DSID = %sysfunc(open(temp)) ;

 %let TOTAL_OBS3 = %sysfunc(attrn(&DSID, nobs)) ;

 %let rc = %sysfunc(close(&DSID)) ;



最後は、かなりマニアック(?)な方法です。

SCLとはScreen Control Languageの略で、
SAS/AFプロダクトなどで使われるSAS言語のうちのひとつです。

ここではそのSCL関数の中から下記3つを使用します。

  • OPEN関数 ・・・SASデータセットを開く

  • ATTRN関数・・・SASデータセットの情報を取得する

  • CLOSE関数・・・SASデータセットを閉じる

まずは、OPEN関数でSASデータセットを開きます。

「OPEN(SASデータセット名)」
また、以降の処理で開いたSASデータセットを識別するために、
戻り値をマクロ変数として定義しています。

次に、ATTRN関数でSASデータセットの情報(ここではオブザベーション数)を取得します。
「ATTRN(SASデータセット識別子, 第2引数)」
OPEN関数で開いたSASデータセットの識別子を第1引数に与えます。
また、第2引数にNOBSというキーワードを指定を指定します。
(NOBS以外にも指定できるキーワードはあります。詳しくはまたの機会に。)

最後に、CLOSE関数で開いているSASデータセットを閉じます。
「CLOSE(SASデータセット識別子)」

OPEN関数で開かれたSASデータセットは、そのままだと開かれたままの状態です。
余程の理由がない限り、CLOSE関数で必ず閉じましょう。

実行結果は下記の通りです。

 f:id:n-insight:20070302235416g:image



以上。長くなりましたが、3通りの方法を紹介しました。
どれがベストな方法かは答えられません。

  • 単純にオブザベーション数を取得するだけなのか

  • 一緒に他の処理も行う必要があるのか

  • 想定されるデータ(容量)はどれぐらいなのか
等、シチュエーションは様々でしょう。
これに限ったことではありませんが、
いくつかの手法の中から状況に応じて使い分けることが、理想でありベストな方法なのだと思います。

ネイチャーインサイト サイトリニューアル&NIBLOGの引っ越し

ご連絡が遅くなりましたが、 ネイチャーインサイトの際とがリニューアルしました。 https://www.n-insight.co.jp/ それに伴い、NIBLOGも引っ越しすることになりました。 https://www.n-insight.co.jp/niblog/ ...