SAS基础宏之8:GetMissNum-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 软件培训>>

SAS软件培训

>>

SAS基础宏之8:GetMissNum

SAS基础宏之8:GetMissNum

发布:playmore | 分类:SAS软件培训

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

获取电子版《CDA一级教材》

完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。

完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。

这个宏用来统计数据集中指定变量的缺失值数量,支持数值变量和字符变量最后都汇到一张结果表格中之前我用的是把表格转置后,用nmiss和cmiss求横向的数组的缺失值这样代码比较简单,但是后来发现proctranspose实在是太 ...
免费学术公开课,扫码加入


这个宏用来统计数据集中指定变量的缺失值数量,支持数值变量和字符变量
最后都汇到一张结果表格中
之前我用的是把表格转置后,用nmiss和cmiss求横向的数组的缺失值
这样代码比较简单,但是后来发现proc transpose实在是太慢了,而且耗资源
这下改了下,直接用sql对列进行计算了,不需要转置了
  1. %macro GetMissNum(SourceTable,TargetTable,InputVar);
  2. /**********************************************************************/
  3. /* 此宏的作用是统计原表中不同变量的缺失值数量。其中SourceTable是原始 */
  4. /* 表格,SourceTable是结果表格;TargetTable是结果表格;InputVar是原始 */
  5. /* 表格中的变量,可设多个变量,用空格分隔,也可如下设置:=_Numeric_表 */
  6. /* 示统计全部数值型变量,=_Character_表示统计全部字符型变量,=_All_表 */
  7. /* 示统计全部变量。 */
  8. /* */
  9. /* 最终结果表格中包含所有指定变量的名称、类型和相应的缺失值数量。 */
  10. /* */
  11. /* Created on 2013.5.8 */
  12. /* Modified on 2013.5.8 */
  13. /**********************************************************************/

  14. /* 检查TargetTable的存在性 */
  15. %if &TargetTable EQ %STR() %then %do;
  16. %put ERROR: The TargetTable should not be blank, please check it again.;
  17. %goto exit;
  18. %end;

  19. /* 检查InputVar的合法性 */
  20. %if %UPCASE(&InputVar) NE _NUMERIC_ AND %UPCASE(&InputVar) NE _CHARACTER_ AND %UPCASE(&InputVar) NE _ALL_ %then %do;
  21. %ChkVar(SourceTable=&SourceTable,InputVar=&InputVar,FlagVarExists=GMN_FlagVarExists);

  22. %if %SYSFUNC(FIND(&GMN_FlagVarExists,0)) NE 0 %then %do;
  23. %put ERROR: The InputVar should be _Numeric_, _Character_, _All_ or any variable name in SourceTable, case insensitive and without quotes.;
  24. %put ERROR: The InputVar "%SCAN(&InputVar,%SYSFUNC(FIND(&GMN_FlagVarExists,0)))" does not exist in SourceTable, please check it again.;
  25. %goto exit;
  26. %end;
  27. %end;

  28. %if %UPCASE(&InputVar) EQ _NUMERIC_ %then %do;
  29. proc contents data=&SourceTable position out=GMN_VarList(keep=name type varnum) noprint;
  30. run;

  31. /* 检查数值型变量是否存在 */
  32. %ChkValue(SourceTable=GMN_VarList,
  33. InputVar=type,
  34. Value=1,
  35. FlagValueExists=GMN_FlagNumVarExists);

  36. %if &GMN_FlagNumVarExists GT 0 %then %do;
  37. proc sql noprint;
  38. select NAME into :GMN_NumVarList separated by ' '
  39. from GMN_VarList
  40. where TYPE EQ 1;
  41. quit;

  42. /* 化简原始表格 */
  43. data &TargetTable(keep=&GMN_NumVarList drop=GMN_i);
  44. set &SourceTable;
  45. array VarList &GMN_NumVarList;
  46. do GMN_i=1 to dim(VarList);
  47. if VarList{GMN_i} NE . then VarList{GMN_i}=0;
  48. else VarList{GMN_i}=1;
  49. end;
  50. run;

  51. %GetStatsForTable(SourceTable=&TargetTable,
  52. TargetTable=&TargetTable,
  53. ByFactors=,
  54. InputVar=&GMN_NumVarList,
  55. InputVarType=,
  56. OutputVarType=,
  57. Weight=,
  58. Statistic=SUM);

  59. proc transpose data=&TargetTable out=&TargetTable;
  60. var &GMN_NumVarList;
  61. run;

  62. data &TargetTable(rename=(_NAME_=VarName _LABEL_=VarLabel COL1=MissNum));
  63. retain _NAME_ _LABEL_ VarType COL1;
  64. set &TargetTable;
  65. VarType='N';
  66. run;
  67. %end;
  68. %else %do;
  69. %put ERROR: There is no numeric variable existed in SourceTable, please check it again.;
  70. %goto exit;
  71. %end;
  72. %end;
  73. %else %if %UPCASE(&InputVar) EQ _CHARACTER_ %then %do;
  74. proc contents data=&SourceTable position out=GMN_VarList(keep=name type varnum) noprint;
  75. run;

  76. /* 检查字符型变量是否存在 */
  77. %ChkValue(SourceTable=GMN_VarList,
  78. InputVar=type,
  79. Value=2,
  80. FlagValueExists=GMN_FlagCharVarExists);

  81. %if &GMN_FlagCharVarExists GT 0 %then %do;
  82. proc sql noprint;
  83. select NAME,STRIP(NAME)||'_Temp' into :GMN_CharVarList separated by ' ',:GMN_CharVarList_Temp separated by ' '
  84. from GMN_VarList
  85. where TYPE EQ 2;
  86. quit;

  87. /* 化简原始表格 */
  88. data &TargetTable(keep=&GMN_CharVarList_Temp drop=GMN_j);
  89. set &SourceTable;
  90. array VarList &GMN_CharVarList;
  91. array VarList_Temp &GMN_CharVarList_Temp;
  92. do GMN_j=1 to dim(VarList);
  93. if VarList{GMN_j} NE "" then VarList_Temp{GMN_j}=0;
  94. else VarList_Temp{GMN_j}=1;
  95. end;
  96. run;

  97. %GetStatsForTable(SourceTable=&TargetTable,
  98. TargetTable=&TargetTable,
  99. ByFactors=,
  100. InputVar=&GMN_CharVarList_Temp,
  101. InputVarType=,
  102. OutputVarType=,
  103. Weight=,
  104. Statistic=SUM);

  105. proc transpose data=&TargetTable out=&TargetTable;
  106. var &GMN_CharVarList_Temp;
  107. run;

  108. data &TargetTable(rename=(_NAME_=VarName _LABEL_=VarLabel COL1=MissNum));
  109. retain _NAME_ _LABEL_ VarType COL1;
  110. set &TargetTable;
  111. VarType='C';
  112. _NAME_=SUBSTR(_NAME_,1,LENGTH(_NAME_)-5);
  113. run;
  114. %end;
  115. %else %do;
  116. %put ERROR: There is no character variable existed in SourceTable, please check it again.;
  117. %goto exit;
  118. %end;
  119. %end;
  120. %else %do;
  121. proc contents data=&SourceTable position out=GMN_VarList(keep=name type varnum) noprint;
  122. run;

  123. /* 筛选指定的变量 */
  124. %if %UPCASE(&InputVar) NE _ALL_ %then %do;
  125. %let InputVar_Comma=%PrxChange(InputString=&InputVar,PrxString=s/(\w+)/'$1'/); /* 给InputVar中的代码加引号 */
  126. %let InputVar_Comma=%SYSFUNC(TRANSLATE(&InputVar_Comma,%STR(,),%STR( ))); /* 替换InputVar中的空格为逗号 */

  127. proc sql noprint;
  128. create table GMN_VarList as
  129. select * from GMN_VarList
  130. where Name in (&InputVar_Comma)
  131. order by Name;
  132. quit;
  133. %end;

  134. /* 检查数值型变量是否存在 */
  135. %ChkValue(SourceTable=GMN_VarList,
  136. InputVar=type,
  137. Value=1,
  138. FlagValueExists=GMN_FlagNumVarExists);

  139. /* 检查字符型变量是否存在 */
  140. %ChkValue(SourceTable=GMN_VarList,
  141. InputVar=type,
  142. Value=2,
  143. FlagValueExists=GMN_FlagCharVarExists);

  144. %if &GMN_FlagNumVarExists GT 0 %then %do;
  145. proc sql noprint;
  146. select NAME into :GMN_NumVarList separated by ' '
  147. from GMN_VarList
  148. where TYPE EQ 1;
  149. quit;

  150. /* 化简原始表格 */
  151. data GMN_NumMiss(keep=&GMN_NumVarList drop=GMN_k);
  152. set &SourceTable;
  153. array VarList &GMN_NumVarList;
  154. do GMN_k=1 to dim(VarList);
  155. if VarList{GMN_k} NE . then VarList{GMN_k}=0;
  156. else VarList{GMN_k}=1;
  157. end;
  158. run;

  159. %GetStatsForTable(SourceTable=GMN_NumMiss,
  160. TargetTable=GMN_NumMiss,
  161. ByFactors=,
  162. InputVar=&GMN_NumVarList,
  163. InputVarType=,
  164. OutputVarType=,
  165. Weight=,
  166. Statistic=SUM);

  167. proc transpose data=GMN_NumMiss out=GMN_NumMiss;
  168. var &GMN_NumVarList;
  169. run;

  170. data GMN_NumMiss(rename=(_NAME_=VarName _LABEL_=VarLabel COL1=MissNum));
  171. retain _NAME_ _LABEL_ VarType COL1;
  172. set GMN_NumMiss;
  173. VarType='N';
  174. run;
  175. %end;
  176. %if &GMN_FlagCharVarExists GT 0 %then %do;
  177. proc sql noprint;
  178. select NAME,STRIP(NAME)||'_Temp' into :GMN_CharVarList separated by ' ',:GMN_CharVarList_Temp separated by ' '
  179. from GMN_VarList
  180. where TYPE EQ 2;
  181. quit;

  182. /* 化简原始表格 */
  183. data GMN_CharMiss(keep=&GMN_CharVarList_Temp drop=GMN_l);
  184. set &SourceTable;
  185. array VarList &GMN_CharVarList;
  186. array VarList_Temp &GMN_CharVarList_Temp;
  187. do GMN_l=1 to dim(VarList);
  188. if VarList{GMN_l} NE "" then VarList_Temp{GMN_l}=0;
  189. else VarList_Temp{GMN_l}=1;
  190. end;
  191. run;

  192. %GetStatsForTable(SourceTable=GMN_CharMiss,
  193. TargetTable=GMN_CharMiss,
  194. ByFactors=,
  195. InputVar=&GMN_CharVarList_Temp,
  196. InputVarType=,
  197. OutputVarType=,
  198. Weight=,
  199. Statistic=SUM);

  200. proc transpose data=GMN_CharMiss out=GMN_CharMiss;
  201. var &GMN_CharVarList_Temp;
  202. run;

  203. data GMN_CharMiss(rename=(_NAME_=VarName _LABEL_=VarLabel COL1=MissNum));
  204. retain _NAME_ _LABEL_ VarType COL1;
  205. set GMN_CharMiss;
  206. VarType='C';
  207. _NAME_=SUBSTR(_NAME_,1,LENGTH(_NAME_)-5);
  208. run;
  209. %end;

  210. data &TargetTable;
  211. set
  212. %if &GMN_FlagNumVarExists GT 0 %then %do;
  213. GMN_NumMiss
  214. %end;
  215. %if &GMN_FlagCharVarExists GT 0 %then %do;
  216. GMN_CharMiss
  217. %end;
  218. ;
  219. run;
  220. %end;

  221. /* 删除不必要的表格 */
  222. proc datasets lib=work nolist;
  223. delete GMN_:;
  224. quit;

  225. %exit:
  226. %mend;


  227. %macro Demo();

  228. %let SourceTable=Cars;
  229. %let TargetTable=MissNum;
  230. %let InputVar=Cylinders; /* =_Numeric_表示统计全部数值型变量,=_Character_表示统计全部字符型变量,=_All_表示统计全部变量,大小写不敏感 */
  231. %GetMissNum(&SourceTable,&TargetTable,&InputVar);

  232. %mend;
复制代码
「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-2347226-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
数据分析师 人大经济论坛 大学 专业 手机版
联系客服
值班时间:工作日(9:00--18:00)