2016年9月26日月曜日

PROC LUAによる変数作成と行追加のはなし



PROC LUA独自の関数でデータセットの加工をしたいと思い色々いじってましたが、詰まった部分がありSAS社に問い合わせをしました。 今回その辺の情報共有をしたいと思います。

(PROC LUAをご存じない方は先に構文のルール等についてリファレンスをご確認下さい)



データセットを作成して変数を追加する例
proc lua;
submit;
   local dsid = sas.open( "work.test", "o" )
   sas.add_vars( dsid, {{name="VAR1", type="N"},
                                    {name="VAR2", type="C", length="20"}} )
   sas.close( dsid )
endsubmit;
run;

  VAR1  
  VAR2  

データセットTESTを作成し、変数VAR1とVAR2を作成しています。
sas.open("work.test","o") の"o" は 「作成モード」 みたいな意味合いで新たにデータセットを作る場合に指定します。



行を追加して値を格納する例
proc lua;
submit;
   local dsid = sas.open("work.test","u")
   sas.append(dsid)
   sas.put_value(dsid, "VAR1", 1)
   sas.put_value(dsid, "VAR2", "aaa")
   sas.update(dsid)
   sas.close(dsid)
endsubmit;
run;

  VAR1  
  VAR2  
  1  aaa

sas.appendsas.update で sas.put_value を囲むと行追加と値の設定ができます。
SAS9.4M5以上じゃないと sas.put_value の部分が正しく動かないかもしれないので注意。

sas.open("work.test","u") の"u" は「編集モード」 みたいな意味合いで既存のデータセットを編集する場合に指定します。



ここまではいいけど、じゃあ 「既存のデータセットに変数を追加するには?」 と思って以下のように「sas.open("work.test","u") 」として変数を追加しようとするとエラーが出てしまいました。
proc lua;
submit;
   local dsid = sas.open("work.test","u")
   sas.add_vars(dsid, {{name="VAR3", type="N"}})
   sas.close(dsid)
endsubmit;
run;

ログ
ERROR: SASシステムにバグが発生しました。SAS導入担当者に次のメッセージを報告してください:

かといって「sas.open("work.test","o") 」とすると、既存のデータセットを上書きしてしまうので、使えません。

この点をSAS社に問い合わせてみたところ、ざっと以下のような回答を頂きました。

・ 上記のような方法で既存のデータセットに変数を追加する事はサポートされていない。
・ この点を今後ドキュメントに明記予定。
・ 代替案として sas.submit が使える。



sas.submitだと以下のような感じでしょうか。

proc lua;
submit;
   sas.submit([[ data TEST; set TEST; length VAR3 8.; call missing(VAR3); run; ]])
endsubmit;
run;
  VAR1  
  VAR2  
  VAR3  
  1  aaa  .

ただし、この書き方だとデータセットに設定されているデータセットオプション(データセットラベルなど)が消えてしまうので注意。


PROC LUA独自の関数でデータ加工がしたかったので、ちょっと残念。
今後サポートされたら記事更新したいと思います。


2 件のコメント:

  1. どうもです。
    これはちょっと、正直どうなんだろうっていう仕様ですね…。
    add_varsっていう機能を作るんであれば、そこは既存DSの置き換えもサポートしないと。

    代替案としてsas.submitが使えますって…
    そりゃそうでしょうよ、そんなことわかってますから!!って感じですね。

    Proc Luaデータセット操作について、既存のSCL関数をベースに設計されたような印象ですが、どうせなら一からオリジナル設計でいいから、もっと違った実装に仕上げて欲しかったですね。

    返信削除
  2. SASYAMAさんどうもです。

    確かにSCLと同名かつ同機能の関数が存在していますね。
    LUAの自由かつ柔軟さは素晴らしいんで、そこを引き継いでPROC LUA独自の関数を作りこんでもらうと、かなりいい感じのプロシジャになりそうですよね。

    LUAとSASデータセットの連携部分に関してはもうちょっとマイナーバージョンアップとかで進化していく事を期待してます。

    返信削除