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;
|
データセット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;
|
sas.append と sas.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;
|
ただし、この書き方だとデータセットに設定されているデータセットオプション(データセットラベルなど)が消えてしまうので注意。
PROC LUA独自の関数でデータ加工がしたかったので、ちょっと残念。
今後サポートされたら記事更新したいと思います。
どうもです。
返信削除これはちょっと、正直どうなんだろうっていう仕様ですね…。
add_varsっていう機能を作るんであれば、そこは既存DSの置き換えもサポートしないと。
代替案としてsas.submitが使えますって…
そりゃそうでしょうよ、そんなことわかってますから!!って感じですね。
Proc Luaデータセット操作について、既存のSCL関数をベースに設計されたような印象ですが、どうせなら一からオリジナル設計でいいから、もっと違った実装に仕上げて欲しかったですね。
SASYAMAさんどうもです。
返信削除確かにSCLと同名かつ同機能の関数が存在していますね。
LUAの自由かつ柔軟さは素晴らしいんで、そこを引き継いでPROC LUA独自の関数を作りこんでもらうと、かなりいい感じのプロシジャになりそうですよね。
LUAとSASデータセットの連携部分に関してはもうちょっとマイナーバージョンアップとかで進化していく事を期待してます。