2017年2月20日月曜日

SASデータセットをXPTファイルに変換する方法




SASデータセットをXPT(XPORT)という移送形式ファイルに変換する方法。



今回のサンプルデータ


MYSASというライブラリを作り、そこにデータセットADSLを格納しときます。

libname MYSAS "適当なパス";

data ADSL (label="SUBJECT LEVEL ANALYSIS DATASET");
   USUBJID="aaa";
run;

proc sort data=ADSL out=MYSAS.ADSL;
   by USUBJID;
run;





XPTファイルに変換するプログラム


以下プログラムを実行するとログにWARNINGが出るかもしれません。
「制限事項」のとこで補足説明してるので今は無視してください。

libname MYXPT xport "XPTファイルを格納するパス\adsl.xpt";

proc copy in=MYSAS out=MYXPT memtype=data;
   select ADSL;
run;

  • libnameでXPTファイルを格納するライブラリ参照を定義。ここではXPTファイル名を含むフルパスを指定する。
  •  proc copyでMYSAS.ADSLをライブラリMYXPTに格納。





制限事項


SASデータセットがSORTプロシジャでソートしてある場合、内部的にSORT情報が保持されており、この状態でXPT変換すると以下のようなWARNINGが表示されます。

proc sort data=MYSAS.ADSL;
   by USUBJID;
run;

libname MYXPT xport "XPTファイルを格納するパス\adsl.xpt";
proc copy in=MYSAS out=MYXPT memtype=data;
   select ADSL;
run;

ログ
WARNING: エンジンXPORTはSORTEDBY処理をサポートしていません。SORTEDBY情報はコピーできません。


ログに出てる通り、XPTではSORT情報が持たせられません。
WARNINGは出ているけどSORT情報がなくなっただけでXPTファイルはちゃんと出来ています。


このWARNINGが嫌であれば、この記事の最初のMYSAS.ADSLを作るプログラムのとこでSORTプロシジャにSORTEDBYオプションを追記すると、SORT情報を消すことができます。

proc sort data=ADSL out=MYSAS.ADSL (sortedby=_null_);
   by USUBJID;
run;

out=にこのオプションを指定するのがポイントです。



その他の制限。
  • 変数名は8文字以内
  • 変数ラベルの長さは40まで
  • データセットラベルも長さ40まで・・・など




製薬業界でのCDISC絡みの話。(2017/02/17現在での話)

CPORTプロシジャでも移送ファイル(CPTファイル)に変換できますが、
PMDAからでてる「技術的ガイドについて」という通知には「CPORT Procedureは使用しないこと」という記述があるのでご注意ください。



4 件のコメント:

  1. proc sort data=ADSL out=MYSAS.ADSL (sortedby=_null_);
    by USUBJID;
    run;
    これだと USUBJIDでソートされちゃうので、sort情報が残っちゃう気がします。

    面倒でも、sortした後に
    data MYSAS.ADSL;
    set MYSAS.ADSL;
    run;
    が必要ではないでしょうか。

    返信削除
    返信
    1. じゅぺさん、コメント有難うございます。
      USUBJIDでソート後に出力する際、

      out=MYSAS.ADSL (sortedby=_null_)

      これで「出力データセットMYSAS.ADSLからsortedby(ソート情報)を消してください」という指令になります。
      先程再検証してみて、proc copyでXPT変換してみたところ、WARNINGも無くまりました。

      記事に色々わかりづらい部分などダメダメな部分があったので修正しました。
      また何かお気づきの点がありましたらコメントお願いします!

      削除
  2. いつも参考にさせていただいたおります。

    XPORTエンジンを使って、XPTに変換する際に、フォーマットカタログも変換できるのでしょうか?
    XPTに変換する、元データセットにはフォーマットが当てられていることが多いかと思いますが、そのような場合にはどのように対応されていますでしょうか?

    返信削除
    返信
    1. コメント有難うございます。

      以下URLの説明みると、XPT変換はデータセットしかサポートされていないみたいです。
      http://www.sas.com/offices/asiapacific/japan/service/technical/howto/transport02.html


      フォーマットカタログも対応しているPROC CPORT使ってCPTファイルを作成するっていう手もありますが、質問者さんの用途にもよるかなと思います。。

      (CDISC対応では、PROC CPORTは使っちゃダメなので)

      削除