我的宏一般前面有大量的参数robust检验,要是有用到我的宏发现ERROR了,
把我之前发的宏Include下就好了
- %macro DeleteMissObs(SourceTable,TargetTable,MissingVar);
- /**********************************************************************/
- /* 此宏删除原表中指定变量为缺失值的观测。其中SourceTable是原始表格; */
- /* TargetTable是结果表格;MissingVar是可能含有缺失值的变量,=_Numeric_*/
- /* 表示选择全部数值型变量,=_Character_表示选择全部字符型变量,=_All_ */
- /* 表示选择全部变量,也可以选择多个变量,用空格分隔。 */
- /* */
- /* 最终结果表格中指定变量为缺失值的观测被删除。 */
- /* */
- /* Created on 2013.1.10 */
- /* Modified on 2013.2.5 */
- /**********************************************************************/
- /* 检查TargetTable的存在性,若不存在则设为&SourceTable */
- %if &TargetTable EQ %STR() %then %let TargetTable=&SourceTable;
- /* 检查MissingVar的存在性 */
- %if %SYSFUNC(FIND(&MissingVar,%STR(:))) NE 0 OR %SYSFUNC(FIND(&MissingVar,%STR(%%))) NE 0 %then %do;
- %GetVarListForTable(SourceTable=&SourceTable,
- TargetTable=,
- OutputVar=DMO_MissingVar,
- VarType=&MissingVar);
-
- %let MissingVar=&DMO_MissingVar;
- %end;
- %if (%UPCASE(&MissingVar) NE _NUMERIC_) AND (%UPCASE(&MissingVar) NE _CHARACTER_) AND (%UPCASE(&MissingVar) NE _ALL_) %then %do;
- %ChkVar(SourceTable=&SourceTable,InputVar=&MissingVar,FlagVarExists=DMO_FlagVarExists1);
- %if %SYSFUNC(FIND(&DMO_FlagVarExists1,0)) NE 0 %then %do;
- %put ERROR: The MissingVar "%SCAN(&MissingVar,%SYSFUNC(FIND(&DMO_FlagVarExists1,0)))" does not exist in SourceTable, please check it again.;
- %goto exit;
- %end;
- %end;
- /* 加引号的MissingVar_Quote用于SQL过程 */
- %let MissingVar_Quote=%PrxChange(InputString=&MissingVar,PrxString=s/(\w+)/'$1'/);
- /* 开始进行计算 */
- %if %UPCASE(&MissingVar) EQ _NUMERIC_ %then %do;
- data &TargetTable(drop=DMO_i);
- set &SourceTable;
- array VarList _NUMERIC_;
- do DMO_i=1 to dim(VarList);
- if VarList{DMO_i} EQ . then delete;
- end;
- run;
- %end;
- %else %if %UPCASE(&MissingVar) EQ _CHARACTER_ %then %do;
- data &TargetTable(drop=DMO_i);
- set &SourceTable;
- array VarList _CHARACTER_;
- do DMO_i=1 to dim(VarList);
- if VarList{DMO_i} EQ '' then delete;
- end;
- run;
- %end;
- %else %if %UPCASE(&MissingVar) EQ _ALL_ %then %do;
- data &TargetTable(drop=DMO_i DMO_j);
- set &SourceTable;
- array VarList_Num _NUMERIC_;
- array VarList_Char _CHARACTER_;
- do DMO_i=1 to dim(VarList_Num);
- if VarList_Num{DMO_i} EQ . then delete;
- end;
- do DMO_j=1 to dim(VarList_Char);
- if VarList_Char{DMO_j} EQ '' then delete;
- end;
- run;
- %end;
- %else %do;
- %GetVarListForTable(SourceTable=&SourceTable,
- TargetTable=DMO_VarList,
- OutputVar=,
- VarType=_ALL_);
- %let DMO_VarList_Num=;
- %let DMO_VarList_Char=;
- proc sql noprint;
- select name into :DMO_VarList_Num separated by ' '
- from DMO_VarList
- where name in (&MissingVar_Quote.) and type EQ 1; /* 数值型 */
- select name into :DMO_VarList_Char separated by ' '
- from DMO_VarList
- where name in (&MissingVar_Quote.) and type EQ 2; /* 字符型 */
- quit;
- data &TargetTable(drop=DMO_i);
- set &SourceTable;
- %if %LENGTH(&DMO_VarList_Num) GT 0 %then %do;
- array VarList_Num &DMO_VarList_Num;
- do DMO_i=1 to dim(VarList_Num);
- if VarList_Num{DMO_i} EQ . then delete;
- end;
- %end;
- %if %LENGTH(&DMO_VarList_Char) GT 0 %then %do;
- array VarList_Char &DMO_VarList_Char;
- do DMO_i=1 to dim(VarList_Char);
- if VarList_Char{DMO_i} EQ '' then delete;
- end;
- %end;
- run;
- %end;
- /* 删除不必要的表格 */
- proc datasets lib=work nolist;
- delete DMO_:;
- quit;
- %exit:
- %mend;
- %macro Demo();
- %let SourceTable=DailyPriceOfIndex;
- %let TargetTable=DailyPriceOfIndex1;
- %let MissingVar=_ALL_; /* =_Numeric_表示选择全部数值型变量,=_Character表示选择全部字符型变量,=_All_表示选择全部变量,也可以选择多个变量,用空格分隔 */
- %DeleteMissObs(&SourceTable,&TargetTable,&MissingVar);
- %mend;



雷达卡






京公网安备 11010802022788号







