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独自の関数でデータ加工がしたかったので、ちょっと残念。
今後サポートされたら記事更新したいと思います。