楼主: playmore
2458 8

[程序分享] SAS基础宏之12:DeleteMissObs [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2013-4-23 13:40:37 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
删除含有缺失值的观测

我的宏一般前面有大量的参数robust检验,要是有用到我的宏发现ERROR了,
把我之前发的宏Include下就好了

  1. %macro DeleteMissObs(SourceTable,TargetTable,MissingVar);
  2. /**********************************************************************/
  3. /* 此宏删除原表中指定变量为缺失值的观测。其中SourceTable是原始表格;  */
  4. /* TargetTable是结果表格;MissingVar是可能含有缺失值的变量,=_Numeric_*/
  5. /* 表示选择全部数值型变量,=_Character_表示选择全部字符型变量,=_All_ */
  6. /* 表示选择全部变量,也可以选择多个变量,用空格分隔。                 */
  7. /*                                                                    */
  8. /* 最终结果表格中指定变量为缺失值的观测被删除。                       */
  9. /*                                                                    */
  10. /*                                      Created on 2013.1.10          */
  11. /*                                      Modified on 2013.2.5          */
  12. /**********************************************************************/

  13. /* 检查TargetTable的存在性,若不存在则设为&SourceTable */
  14. %if &TargetTable EQ %STR() %then %let TargetTable=&SourceTable;

  15. /* 检查MissingVar的存在性 */
  16. %if %SYSFUNC(FIND(&MissingVar,%STR(:))) NE 0 OR %SYSFUNC(FIND(&MissingVar,%STR(%%))) NE 0 %then %do;
  17.     %GetVarListForTable(SourceTable=&SourceTable,
  18.         TargetTable=,
  19.         OutputVar=DMO_MissingVar,
  20.         VarType=&MissingVar);

  21.   %let MissingVar=&DMO_MissingVar;
  22. %end;

  23. %if (%UPCASE(&MissingVar) NE _NUMERIC_) AND (%UPCASE(&MissingVar) NE _CHARACTER_) AND (%UPCASE(&MissingVar) NE _ALL_) %then %do;
  24.         %ChkVar(SourceTable=&SourceTable,InputVar=&MissingVar,FlagVarExists=DMO_FlagVarExists1);

  25.         %if %SYSFUNC(FIND(&DMO_FlagVarExists1,0)) NE 0 %then %do;
  26.                 %put ERROR: The MissingVar "%SCAN(&MissingVar,%SYSFUNC(FIND(&DMO_FlagVarExists1,0)))" does not exist in SourceTable, please check it again.;
  27.                 %goto exit;
  28.         %end;
  29. %end;

  30. /* 加引号的MissingVar_Quote用于SQL过程 */
  31. %let MissingVar_Quote=%PrxChange(InputString=&MissingVar,PrxString=s/(\w+)/'$1'/);

  32. /* 开始进行计算 */
  33. %if %UPCASE(&MissingVar) EQ _NUMERIC_ %then %do;
  34.         data &TargetTable(drop=DMO_i);
  35.                 set &SourceTable;
  36.                 array VarList _NUMERIC_;
  37.                 do DMO_i=1 to dim(VarList);
  38.                         if VarList{DMO_i} EQ . then delete;
  39.                 end;
  40.         run;
  41. %end;
  42. %else %if %UPCASE(&MissingVar) EQ _CHARACTER_ %then %do;
  43.         data &TargetTable(drop=DMO_i);
  44.                 set &SourceTable;
  45.                 array VarList _CHARACTER_;
  46.                 do DMO_i=1 to dim(VarList);
  47.                         if VarList{DMO_i} EQ '' then delete;
  48.                 end;
  49.         run;
  50. %end;
  51. %else %if %UPCASE(&MissingVar) EQ _ALL_ %then %do;
  52.         data &TargetTable(drop=DMO_i DMO_j);
  53.                 set &SourceTable;
  54.                 array VarList_Num _NUMERIC_;
  55.                 array VarList_Char _CHARACTER_;
  56.                 do DMO_i=1 to dim(VarList_Num);
  57.                         if VarList_Num{DMO_i} EQ . then delete;
  58.                 end;
  59.                 do DMO_j=1 to dim(VarList_Char);
  60.                         if VarList_Char{DMO_j} EQ '' then delete;
  61.                 end;
  62.         run;
  63. %end;
  64. %else %do;
  65.         %GetVarListForTable(SourceTable=&SourceTable,
  66.                 TargetTable=DMO_VarList,
  67.                 OutputVar=,
  68.                 VarType=_ALL_);

  69.         %let DMO_VarList_Num=;
  70.         %let DMO_VarList_Char=;

  71.         proc sql noprint;
  72.                 select name into :DMO_VarList_Num separated by ' '
  73.                         from DMO_VarList
  74.                         where name in (&MissingVar_Quote.) and type EQ 1;                /* 数值型 */
  75.                 select name into :DMO_VarList_Char separated by ' '
  76.                         from DMO_VarList
  77.                         where name in (&MissingVar_Quote.) and type EQ 2;                /* 字符型 */
  78.         quit;

  79.         data &TargetTable(drop=DMO_i);
  80.                 set &SourceTable;
  81.                 %if %LENGTH(&DMO_VarList_Num) GT 0 %then %do;
  82.                         array VarList_Num &DMO_VarList_Num;
  83.                         do DMO_i=1 to dim(VarList_Num);
  84.                                 if VarList_Num{DMO_i} EQ . then delete;
  85.                         end;
  86.                 %end;
  87.                 %if %LENGTH(&DMO_VarList_Char) GT 0 %then %do;
  88.                         array VarList_Char &DMO_VarList_Char;
  89.                         do DMO_i=1 to dim(VarList_Char);
  90.                                 if VarList_Char{DMO_i} EQ '' then delete;
  91.                         end;
  92.                 %end;
  93.         run;
  94. %end;

  95. /* 删除不必要的表格 */
  96. proc datasets lib=work nolist;
  97.         delete DMO_:;
  98. quit;

  99. %exit:
  100. %mend;


  101. %macro Demo();

  102. %let SourceTable=DailyPriceOfIndex;
  103. %let TargetTable=DailyPriceOfIndex1;
  104. %let MissingVar=_ALL_;                /* =_Numeric_表示选择全部数值型变量,=_Character表示选择全部字符型变量,=_All_表示选择全部变量,也可以选择多个变量,用空格分隔 */
  105. %DeleteMissObs(&SourceTable,&TargetTable,&MissingVar);

  106. %mend;
复制代码




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:delete sas基础 EMIS Miss ele ERROR

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
huangliang0828 + 1 + 1 + 1 对论坛有贡献
webgu + 50 + 50 + 3 + 3 + 3 精彩帖子

总评分: 经验 + 50  论坛币 + 50  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

本帖被以下文库推荐

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
醍醐01 在职认证  发表于 2013-4-23 21:07:43
身体但是官方斯蒂芬
No pains ,no gains.

藤椅
ryuuzt 发表于 2013-4-24 09:42:43
拜读,收藏,学习,感谢。

板凳
webgu 发表于 2013-4-24 14:28:15
我觉得,检查存在性什么的,也可以写成一个通用宏了.
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

报纸
playmore 发表于 2013-4-24 14:58:30
webgu 发表于 2013-4-24 14:28
我觉得,检查存在性什么的,也可以写成一个通用宏了.
其实已经有一个ChkVar了
后面只是多加了一个%if和%put ERROR
不想把这些也包括进去

我做这么多前期检查也是为了在以后宏套宏的时候方便Debug
比如我宏内临时表的表名和临时宏变量名,都加了宏名缩写做为前缀
就是为了在出现ERROR的时候快速定位出错的宏

用SAS写宏比用Matlab写m文件累多了,呵呵
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

地板
webgu 发表于 2013-4-24 16:29:40
playmore 发表于 2013-4-24 14:58
其实已经有一个ChkVar了
后面只是多加了一个%if和%put ERROR
不想把这些也包括进去
佩服你的毅力和耐性。
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

7
webgu 发表于 2013-4-24 16:29:44
playmore 发表于 2013-4-24 14:58
其实已经有一个ChkVar了
后面只是多加了一个%if和%put ERROR
不想把这些也包括进去
佩服你的毅力和耐性。
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

8
Bridgenc 发表于 2013-4-24 19:44:12
Thanks for sharing

9
andrew313313 发表于 2013-4-26 10:38:36
相信自己,付出努力,终会成功!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 09:07