五月天婷亚洲天久久综合网,婷婷丁香五月激情亚洲综合,久久男人精品女人,麻豆91在线播放

  • <center id="8gusu"></center><rt id="8gusu"></rt>
    <menu id="8gusu"><small id="8gusu"></small></menu>
  • <dd id="8gusu"><s id="8gusu"></s></dd>
    樓主: playmore
    7113 18

    [程序分享] SAS基礎(chǔ)宏之8:GetMissNum [推廣有獎]

    • 16關(guān)注
    • 79粉絲

    學(xué)科帶頭人

    2%

    還不是VIP/貴賓

    -

    TA的文庫  其他...

    R相關(guān)

    經(jīng)濟學(xué)相關(guān)

    金融工程

    威望
    1
    論壇幣
    16330 個
    通用積分
    8.5797
    學(xué)術(shù)水平
    372 點
    熱心指數(shù)
    394 點
    信用等級
    341 點
    經(jīng)驗
    15297 點
    帖子
    1194
    精華
    1
    在線時間
    1331 小時
    注冊時間
    2007-1-11
    最后登錄
    2023-12-15

    初級學(xué)術(shù)勛章 初級熱心勛章 中級熱心勛章

    樓主
    playmore 發(fā)表于 2013-4-16 15:04:18 |只看作者 |壇友微信交流群|倒序 |AI寫論文

    +2 論壇幣
    k人 參與回答

    經(jīng)管之家送您一份

    應(yīng)屆畢業(yè)生專屬福利!

    求職就業(yè)群
    趙安豆老師微信:zhaoandou666

    經(jīng)管之家聯(lián)合CDA

    送您一個全額獎學(xué)金名額~ !

    感謝您參與論壇問題回答

    經(jīng)管之家送您兩個論壇幣!

    +2 論壇幣
    這個宏用來統(tǒng)計數(shù)據(jù)集中指定變量的缺失值數(shù)量,支持數(shù)值變量和字符變量
    最后都匯到一張結(jié)果表格中

    之前我用的是把表格轉(zhuǎn)置后,用nmiss和cmiss求橫向的數(shù)組的缺失值
    這樣代碼比較簡單,但是后來發(fā)現(xiàn)proc transpose實在是太慢了,而且耗資源
    這下改了下,直接用sql對列進行計算了,不需要轉(zhuǎn)置了

    1. %macro GetMissNum(SourceTable,TargetTable,InputVar);
    2. /**********************************************************************/
    3. /* 此宏的作用是統(tǒng)計原表中不同變量的缺失值數(shù)量。其中SourceTable是原始 */
    4. /* 表格,SourceTable是結(jié)果表格;TargetTable是結(jié)果表格;InputVar是原始 */
    5. /* 表格中的變量,可設(shè)多個變量,用空格分隔,也可如下設(shè)置:=_Numeric_表 */
    6. /* 示統(tǒng)計全部數(shù)值型變量,=_Character_表示統(tǒng)計全部字符型變量,=_All_表 */
    7. /* 示統(tǒng)計全部變量。 */
    8. /* */
    9. /* 最終結(jié)果表格中包含所有指定變量的名稱、類型和相應(yīng)的缺失值數(shù)量。 */
    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. /* 檢查數(shù)值型變量是否存在 */
    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. /* 檢查數(shù)值型變量是否存在 */
    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_表示統(tǒng)計全部數(shù)值型變量,=_Character_表示統(tǒng)計全部字符型變量,=_All_表示統(tǒng)計全部變量,大小寫不敏感 */
    231. %GetMissNum(&SourceTable,&TargetTable,&InputVar);

    232. %mend;
    復(fù)制代碼

    二維碼

    掃碼加我 拉你入群

    請注明:姓名-公司-職位

    以便審核進群資格,未注明則拒絕

    關(guān)鍵詞:sas基礎(chǔ) Miss Get Iss MIS 基礎(chǔ)

    已有 4 人評分經(jīng)驗 論壇幣 學(xué)術(shù)水平 熱心指數(shù) 信用等級 收起 理由
    eijuhz + 20 精彩帖子
    crackman + 20 分析的有道理
    webgu + 100 + 100 + 5 + 5 + 5 精彩帖子
    Imasasor + 100 + 100 + 5 + 5 + 5 鼓勵積極發(fā)帖討論

    總評分: 經(jīng)驗 + 240  論壇幣 + 200  學(xué)術(shù)水平 + 10  熱心指數(shù) + 10  信用等級 + 10   查看全部評分

    本帖被以下文庫推薦

    playmore邀請您訪問ChinaTeX論壇!!進入ChinaTeX論壇
    沙發(fā)
    playmore 發(fā)表于 2013-4-16 15:05:13 |只看作者 |壇友微信交流群
    我擦,縮進正常了
    老天有眼啊
    playmore邀請您訪問ChinaTeX論壇。!進入ChinaTeX論壇
    藤椅
    Imasasor 發(fā)表于 2013-4-16 15:46:53 |只看作者 |壇友微信交流群
    這么長的宏,看著都眼花,想問一下,是怎么寫出來的?
    歡迎加入亞太地區(qū)第一R&Python數(shù)據(jù)挖掘群: 251548215;
    板凳
    webgu 發(fā)表于 2013-4-16 23:01:34 |只看作者 |壇友微信交流群
    考慮得很嚴謹啊。佩服。
    SAS資源
    1. SAS 微信:StatsThinking
    2. SAS QQ群:348941365
    報紙
    playmore 發(fā)表于 2013-4-17 08:37:11 |只看作者 |壇友微信交流群
    Imasasor 發(fā)表于 2013-4-16 15:46
    這么長的宏,看著都眼花,想問一下,是怎么寫出來的?
    人肉寫的唄
    只不過只要寫一次,以后就都方便了
    這個宏用于檢查回歸中自變量的缺失數(shù)量
    我發(fā)現(xiàn)proc reg里都沒有相應(yīng)的控制選項
    所以只能人肉做
    playmore邀請您訪問ChinaTeX論壇。。進入ChinaTeX論壇
    地板
    ryuuzt 發(fā)表于 2013-4-24 10:01:36 |只看作者 |壇友微信交流群
    拜讀,收藏,學(xué)習(xí),感謝。
    人肉做的,了不起。
    7
    00810112 發(fā)表于 2013-4-26 10:41:00 |只看作者 |壇友微信交流群
    學(xué)習(xí),學(xué)習(xí),
    這里還是有個疑問,如果數(shù)據(jù)行數(shù)太多,做transpose會不會受到影響?
    8
    playmore 發(fā)表于 2013-4-26 11:21:49 |只看作者 |壇友微信交流群
    00810112 發(fā)表于 2013-4-26 10:41
    學(xué)習(xí),學(xué)習(xí),
    這里還是有個疑問,如果數(shù)據(jù)行數(shù)太多,做transpose會不會受到影響?
    會有影響
    但是我想不到其他好辦法了

    另外為了加快transpose時的速度
    我在之前把原始表格化簡了下
    即有值的換為'a',沒值的換為''
    這樣轉(zhuǎn)置的時候快多了
    playmore邀請您訪問ChinaTeX論壇!。進入ChinaTeX論壇
    9
    00810112 發(fā)表于 2013-4-26 16:45:45 |只看作者 |壇友微信交流群
    en ,
    10
    gzh4 發(fā)表于 2013-5-10 16:46:51 |只看作者 |壇友微信交流群
    謝謝分享
    您需要登錄后才可以回帖 登錄 | 我要注冊

    本版微信群
    加好友,備注cda
    拉您進交流群

    京ICP備16021002-2號 京B2-20170662號 京公網(wǎng)安備 11010802022788號 論壇法律顧問:王進律師 知識產(chǎn)權(quán)保護聲明   免責(zé)及隱私聲明

    GMT+8, 2024-12-23 22:05