%FLGMAKEマクロ

277 Views

April 02, 24

スライド概要

[第4回大阪sas勉強会]坂尻大樹

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

%FLGMAKEマクロ 2018.12.21 イーピーエス株式会社 坂尻大樹

2.

--本日の内容-・自己紹介 ・業務で作ったマクロの紹介

3.

--自己紹介-・氏名:坂尻 大樹 (サカジリ ヒロキ) ・出身:大阪府 (大東市) ・系歴:大阪桐蔭高校 大阪府立大学大学院 (生命環境科学研究科)

4.

--今回のマクロでやりたいこと-→異なるDSの情報からフラグを作りたい →例:有害事象のDSの情報から重篤な有害事象を発現した症例を抽出し、 患者背景のDSにフラグを作りたい (でもSORT→MERGEはしたくない…) →ハッシュオブジェクトのCHECKメソッドとMULTIDATA:‘Y‘を使えば楽に できる!!

5.

--引数-%MACRO FLGMAKE(MASTER=,KEY=,FLG=,WH=,TYPE=1,MISSWARN=N); MASTER :データを持ってきたいマスターとなるデータセット KEY :ルックアップするためのキー変数(複数指定可能) FLG :フラグを立てる変数名を設定 WH :条件を設定(WH=%STR(AEFLG="Y")) TYPE :該当/非該当 (デフォルトはTYPE=1) TYPE=1(1/2) TYPE=2(1/0) TYPE=3(Y/N) MISSWARN :元データのKEY欠損を許容するか否か (デフォルトはN (欠損の場合、WARNINGとして出ます))

6.

--記載例-DATA ADSL; SET HEAD; %FLGMAKE(MASTER=AE,KEY=STUDY SUBJID,FLG=AEUMU,WH=%STR(AEFLG="Y")); RUN; ・IF文にネストしなければ、どこに入れても構いません。 (IF文に入れても問題は無いかもしれませんが、非推奨です…) ・1つのデータステップ中に何回でも入れれます。

7.

--マクロの中身1-%MACRO FLGMAKE(MASTER=,KEY=,FLG=,WH=,TYPE=1,MISSWARN=N); /*設定*/ %LOCAL NAME QKEY KEYNUM KEY WH; %LET KEY=%SYSFUNC(COMPBL(&KEY.)); %LET NAME = &SYSINDEX.; %LET QKEY = %SYSFUNC( TRANWRD( %STR("&KEY.") , %STR( ) , %STR(",") ) ); %LET KEYNUM = %SYSFUNC( COUNT( &KEY., %STR ( ) )); /*参照元データ準備*/ IF 0 THEN SET &MASTER(KEEP= &KEY); /*IF文にネストして使われた際、_N_=1では危険なので念のため*/ RETAIN _N_&NAME 1;

8.
[beta]
--マクロの中身2-/*ハッシュ設定*/
IF _N_&NAME = 1 THEN DO;
%IF %LENGTH(&WH) NE 0 %THEN %DO;
DECLARE HASH H&NAME.(DATASET :"&MASTER( WHERE = (" || %SYSFUNC(QUOTE(&W H.)) || "))" , MULTIDATA:'Y');
%END;
条件を入れてます。
%ELSE %DO;
DECLARE HASH H&NAME.(DATASET:"&MASTER.(KEEP= &KEY.)", MULTIDATA:'Y');
%END;
H&NAME..DEFINEKEY(&QKEY.);
H&NAME..DEFINEDONE();
参照先のデータがKeyに対し
_N_&NAME = 0 ;
DROP _N_&NAME.;
END;
/*フラグの変数を初期化*/
%IF %LENGTH(&KEY.) NE 0 %THEN %DO;
CALL MISSING(OF &FLG.);
%END;

て、1対1で対応してなくても
OKです。

9.
[beta]
--マクロの中身3-/*フラグ立て*/
%IF %UPCASE(&TYPE.) EQ 1 %THEN %DO;
&FLG. = IFN(H&NAME..CHECK()=0,1,2);
%END;
%IF %UPCASE(&TYPE.) EQ 2 %THEN %DO;
&FLG. = IFN(H&NAME..CHECK()=0,1,0);
%END;
%IF %UPCASE(&TYPE.) EQ 3 %THEN %DO;
&FLG. = IFC(H&NAME..CHECK()=0,"Y","N");
%END;

記載を例に好きなフラグの付
け方を設定してください。
/*元データのKEY欠損を許容するか否か*/
%IF %UPCASE(&MISSWARN.)= N %THEN %DO;
IF CMISS(OF &KEY.)>0THEN DO;
PUTLOG "WARNING:元データ内にKEY欠損があります。" +2 (&KEY.) (=);
CALL MISSING(OF &FLG.);
END;
%END;
%MEND FLGMAKE;

10.

--参考-(1) 森岡裕(2018) DOSUBL関数内で生成したビューをハッシュオブジェクトに格納することによりPROC DS2の ハッシュパッケージの挙動を擬似的に再現する方法 『SAS ユーザー総会2018 論文集』 (2) SAS備忘録「Hashオブジェクトは、CDISCに係るSASプログラミングと相性バッチリ 」 http://sas-boubi.blogspot.com/2018/07/

11.

ありがとうございました。

12.
[beta]
/*=========================================================
FLGMAKEマクロ
---------------------------------------------------------データステップ中に挿入し、マスター(MASTER=)で指定したデータセット
から指定したキー(KEY=)に一致するレコードについてフラグ立てするマクロ。
MASTER
:データを持ってきたいマスターとなるデータセット
KEY
:ルックアップするためのキー変数(複数指定可能)
FLG
:フラグを立てる変数名を設定
WH
:条件を設定(WH=%STR(AEFLG="Y"))
TYPE
:該当/非該当 TYPE=1(1/2) TYPE=2(1/0) TYPE=3(Y/N) (デフォルトはTYPE=1)
MISSWARN
:元データのKEY欠損を許容するか否か(デフォルトはN(欠損はWARNINGとして出ます))
---------------------------------------------------------・SAS 9.13以上の環境

%MACRO FLGMAKE(MASTER=,KEY=,FLG=,WH=,TYPE=1,MISSWARN=N);
/*設定*/
%LOCAL NAME QKEY KEYNUM KEY WH;
%LET KEY=%SYSFUNC(COMPBL(&KEY.));
%LET NAME = &SYSINDEX.;
%LET QKEY = %SYSFUNC( TRANWRD( %STR("&KEY.") , %STR( ) , %STR(",") ) );
%LET KEYNUM = %SYSFUNC( COUNT( &KEY., %STR ( ) ));

/*参照元データ準備*/
IF 0 THEN SET &MASTER(KEEP= &KEY);
/*IF文にネストして使われた際、_N_=1では危険なので念のため*/
RETAIN _N_&NAME 1;

/*ハッシュ設定*/
IF _N_&NAME = 1 THEN DO;

オリジナル:20181105 坂尻大樹
---------------------------------------------------------【注意点】
・IF文の中にネストしての使用は不可能です
[NG例] DATA A;
SET B;
IF XX = 1 THEN DO;
%FLGMAKE(MASTER=AE,KEY=STUDY
SUBJID,FLG=AEUMU,WH=%STR(AEFLG="Y"));
END;
RUN;

【記載例】
DATA ADSL;
SET HEAD;
%FLGMAKE(MASTER=AE,KEY=STUDY SUBJID,FLG=AEUMU,WH=%STR(AEFLG="Y"));
RUN;
============================================================*/

%IF %LENGTH(&WH) NE 0 %THEN %DO;
DECLARE HASH H&NAME.(DATASET :"&MASTER( WHERE = (" || %SYSFUNC(QUOTE(&WH.)) || "))" , MULTIDATA:'Y');
%END;
%ELSE %DO;
DECLARE HASH H&NAME.(DATASET:"&MASTER.(KEEP= &KEY.)", MULTIDATA:'Y');
%END;
H&NAME..DEFINEKEY(&QKEY.);
H&NAME..DEFINEDONE();
_N_&NAME = 0 ;
DROP _N_&NAME.;
END;

/*フラグの変数を初期化*/
%IF %LENGTH(&KEY.) NE 0 %THEN %DO;
CALL MISSING(OF &FLG.);
%END;
/*フラグ立て*/
%IF %UPCASE(&TYPE.) EQ 1 %THEN %DO;
&FLG. = IFN(H&NAME..CHECK()=0,1,2);
%END;
%IF %UPCASE(&TYPE.) EQ 2 %THEN %DO;
&FLG. = IFN(H&NAME..CHECK()=0,1,0);
%END;
%IF %UPCASE(&TYPE.) EQ 3 %THEN %DO;
&FLG. = IFC(H&NAME..CHECK()=0,"Y","N");
%END;
/*元データのKEY欠損を許容するか否か*/
%IF %UPCASE(&MISSWARN.)= N %THEN %DO;
IF CMISS(OF &KEY.)>0THEN DO;
PUTLOG "WARNING:元データ内にKEY欠損があります。" +2 (&KEY.) (=);
CALL MISSING(OF &FLG.);
END;
%END;
%MEND FLGMAKE;