楼主: luckychll
13936 5

[程序分享] 检查数据集中行列缺失值个数 [推广有奖]

  • 14关注
  • 2粉丝

本科生

26%

还不是VIP/贵宾

-

威望
0
论坛币
229 个
通用积分
0.0602
学术水平
7 点
热心指数
15 点
信用等级
6 点
经验
242 点
帖子
68
精华
0
在线时间
83 小时
注册时间
2011-9-24
最后登录
2016-12-16

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

1 检查数据集中每条观测数值变量有多少个变量是缺失的。

data a(keep=k);

set a ;

array x _numeric_ ;

do i=1 to dim(x);

if x(i)=. then j+1;

end;

k=j-lag(j);

if j=0 and k=. then k=0;

label k="每条观测的缺失个数";

run;


2  检查数据中每个变量的缺失个数。

proc means data=a nmiss noprint;

var var1-varn;

output out=miss(drop=_type_ _freq_) nmiss=;

run;


以上在学习上的一点总结,还在点点滴滴的积累,程序较笨拙。欢迎各位高手指点!



二维码

扫码加我 拉你入群

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

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

关键词:查数据 数据集 缺失值 numeric output 检查

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 50 + 1 + 1 + 1 鼓励积极发帖讨论

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

沙发
webgu 发表于 2013-1-22 17:37:05 |只看作者 |坛友微信交流群
你可以考虑完善下有字符变量的情况。
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

使用道具

藤椅
playmore 发表于 2013-1-23 09:47:52 |只看作者 |坛友微信交流群
webgu 发表于 2013-1-22 17:37
你可以考虑完善下有字符变量的情况。
针对lz的第2个问题,包含数值型和字符型变量,我写了下面这个宏,供参考
  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 2012.9.6           */
  12. /*                                      Modified on 2012.10.16        */
  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.                 %goto exit;
  25.         %end;
  26. %end;

  27. %if %UPCASE(&InputVar) EQ NUMERIC %then %do;
  28.         proc means data=&SourceTable noprint;                /* proc means仅针对数值型变量 */
  29.                   output out=GMN_MissNumeric nmiss=;
  30.         run;

  31.         proc transpose data=GMN_MissNumeric out=&TargetTable name=VarName;
  32.                 var _ALL_;
  33.         run;

  34.         data &TargetTable(rename=(COL1=MissNum));
  35.                 set &TargetTable;
  36.                 VarType='N';
  37.                 if _N_>2;
  38.         run;
  39. %end;
  40. %else %if %UPCASE(&InputVar) EQ CHARACTER %then %do;
  41.         proc contents data=&SourceTable position out=GMN_VarList(keep=name type varnum) noprint;
  42.         run;

  43.         /* 检查字符型变量是否存在 */
  44.         %ChkValue(SourceTable=GMN_VarList,
  45.                 InputVar=type,
  46.                 Value=2,
  47.                 FlagValueExists=GMN_FlagCharVarExists);

  48.         %if &GMN_FlagCharVarExists GT 0 %then %do;
  49.                 proc sql noprint;
  50.                         select compress(name)||'_0' into :GMN_VarNameChar separated by ' '
  51.                                 from GMN_VarList where type=2 order by varnum;
  52.                 quit;

  53.                 data GMN_VarListChar(drop=_CHARACTER_ i);
  54.                         set &SourceTable(keep=_CHARACTER_);
  55.                         array mychar(*) $ _CHARACTER_;
  56.                         array mynum(*) &GMN_VarNameChar;
  57.                         do i=1 to dim(mychar);
  58.                             if  mychar(i) ="" then mynum{i}=.;
  59.                                 else mynum(i)=1;
  60.                         end;
  61.                 run;

  62.                 proc means data=GMN_VarListChar noprint;
  63.                           output out=GMN_MissChar nmiss=;
  64.                 run;

  65.                 proc transpose data=GMN_MissChar out=&TargetTable name=VarName;
  66.                         var _ALL_;
  67.                 run;

  68.                 data &TargetTable(rename=(COL1=MissNum));
  69.                         set &TargetTable;
  70.                         VarType='C';
  71.                         if SUBSTR(VarName,LENGTH(VarName)-1,2) EQ '_0' then VarName=SUBSTR(VarName,1,LENGTH(VarName)-2);
  72.                         if _N_>2;
  73.                 run;
  74.         %end;
  75.         %else %do;
  76.                 %put ERROR: There is no character variable existed in SourceTable, please check it again.;
  77.                 %goto exit;
  78.         %end;
  79. %end;
  80. %else %do;
  81.         proc means data=&SourceTable noprint;                /* proc means仅针对数值型变量 */
  82.                   output out=GMN_MissNumeric nmiss=;
  83.         run;

  84.         proc transpose data=GMN_MissNumeric out=GMN_MissNumeric name=VarName;
  85.                 var _ALL_;
  86.         run;

  87.         data GMN_MissNumeric;
  88.                 set GMN_MissNumeric;
  89.                 VarType='N';
  90.         run;

  91.         proc contents data=&SourceTable position out=GMN_VarList(keep=name type varnum) noprint;
  92.         run;

  93.         /* 检查字符型变量是否存在 */
  94.         %ChkValue(SourceTable=GMN_VarList,
  95.                 InputVar=type,
  96.                 Value=2,
  97.                 FlagValueExists=GMN_FlagCharVarExists);

  98.         %if &GMN_FlagCharVarExists GT 0 %then %do;
  99.                 proc sql noprint;
  100.                         select compress(name)||'_0' into :GMN_VarNameChar separated by ' '
  101.                                 from GMN_VarList where type=2 order by varnum;
  102.                 quit;

  103.                 data GMN_VarListChar(drop=_CHARACTER_ i);
  104.                         set &SourceTable(keep=_CHARACTER_);
  105.                         array mychar(*) $ _CHARACTER_;
  106.                         array mynum(*) &GMN_VarNameChar;
  107.                         do i=1 to dim(mychar);
  108.                             if  mychar(i) ="" then mynum{i}=.;
  109.                                 else mynum(i)=1;
  110.                         end;
  111.                 run;

  112.                 proc means data=GMN_VarListChar noprint;
  113.                           output out=GMN_MissChar nmiss=;
  114.                 run;

  115.                 proc transpose data=GMN_MissChar out=GMN_MissChar name=VarName;
  116.                         var _ALL_;
  117.                 run;

  118.                 data GMN_MissChar;
  119.                         set GMN_MissChar;
  120.                         VarType='C';
  121.                         if SUBSTR(VarName,LENGTH(VarName)-1,2) EQ '_0' then VarName=SUBSTR(VarName,1,LENGTH(VarName)-2);
  122.                 run;

  123.                 data GMN_MissNum;
  124.                         length VarName $32;
  125.                         set GMN_MissNumeric GMN_MissChar;
  126.                 run;
  127.         %end;
  128.         %else %do;
  129.                 data GMN_MissNum;
  130.                         set GMN_MissNumeric;
  131.                 run;
  132.         %end;

  133.         proc sql noprint;
  134.                 create table &TargetTable as
  135.                         select GMN_VarList.Name as VarName,GMN_MissNum.COL1 as MissNum,GMN_MissNum.VarType
  136.                                 from GMN_VarList left join GMN_MissNum
  137.                                 on GMN_VarList.Name EQ GMN_MissNum.VarName
  138.                                 order by GMN_VarList.VarNum;
  139.         quit;

  140.         /* 若InputVar=All,则就此完结,否则还需要进行如下的步骤 */
  141.         %if %UPCASE(&InputVar) NE ALL %then %do;
  142.                 %let InputVar_Comma=%PrxChange(InputString=&InputVar,PrxString=s/(\w+)/'$1'/);                /* 给InputVar中的代码加引号 */
  143.                 %let InputVar_Comma=%SYSFUNC(TRANSLATE(&InputVar_Comma,%STR(,),%STR( )));                /* 替换InputVar中的空格为逗号 */

  144.                 proc sql noprint;
  145.                         create table &TargetTable as
  146.                                 select GMN_VarList.Name as VarName,GMN_MissNum.COL1 as MissNum,GMN_MissNum.VarType
  147.                                         from GMN_VarList inner join GMN_MissNum
  148.                                         on GMN_VarList.Name=GMN_MissNum.VarName and
  149.                                                 GMN_VarList.Name in (&InputVar_Comma)
  150.                                         order by GMN_VarList.VarNum;
  151.                 quit;
  152.         %end;
  153. %end;

  154. /* 删除不必要的表格 */
  155. proc datasets lib=work nolist;
  156.         delete GMN_:;
  157. quit;

  158. %exit:
  159. %mend;


  160. %macro Demo();

  161. %let SourceTable=GLOLD_TradeDate;
  162. %let TargetTable=AAA;
  163. %let InputVar=CHARACTER;                /* =Numeric表示统计全部数值型变量,=Character表示统计全部字符型变量,=All表示统计全部变量,大小写不敏感 */
  164. %GetMissNum(&SourceTable,&TargetTable,&InputVar);

  165. %mend;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
admin_kefu + 30 + 3 + 5 热心帮助其他会员

总评分: 论坛币 + 30  学术水平 + 3  热心指数 + 5   查看全部评分

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

使用道具

板凳
☆Justforyou 发表于 2014-4-1 20:33:18 |只看作者 |坛友微信交流群
楼主你好,我有一个疑问,若数据集的第一条观测值有缺失值,那么最后得到的第一条观测值的缺失值的个数显示为缺失,这是个什么情况?代码如下:

data a;
input V1-V5@@;
datalines;
1 . 4 2 6
3 . . . .
1 2 . 2 4
;
run;

data b(keep=k);
set a ;
array x _numeric_ ;
do i=1 to dim(x);
if x(i)=. then j+1;
end;
k=j-lag(j);
if j=0  and k=. then k=0;
label k="每条观测的缺失个数";
run;

使用道具

报纸
shaobl 发表于 2017-10-18 23:12:02 |只看作者 |坛友微信交流群
☆Justforyou 发表于 2014-4-1 20:33
楼主你好,我有一个疑问,若数据集的第一条观测值有缺失值,那么最后得到的第一条观测值的缺失值的个数显示 ...
楼主的代码忽略了这个问题,加一句语句就可以解决了。
  1. data b(keep=k);
  2. set a ;
  3. array x _numeric_ ;
  4. do i=1 to dim(x);
  5. if x(i)=. then j+1;
  6. end;
  7. k=j-lag(j);/*因为第一个观测上面没有观测,故第一个观测的k一定为缺失*/
  8. if j=0  and k=. then k=0;
  9. if j^=. and k=. then k=j;/*这句就是定义当j不等于缺失但k为缺失时(即第一个观测这种情况),k=j,第一行的j就是其实际缺失个数*/
  10. label k="每条观测的缺失个数";
  11. run;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 收起 理由
小姚爱科研 + 1 + 1 精彩帖子
admin_kefu + 30 + 3 + 3 热心帮助其他会员

总评分: 论坛币 + 30  学术水平 + 4  热心指数 + 4   查看全部评分

使用道具

地板
小姚爱科研 学生认证  发表于 2023-3-6 12:03:16 |只看作者 |坛友微信交流群
我自己照着楼组的代码改编了下,也是用的array和do循环为每个观测遍历缺失值,最后加和,这样做应该也行?就是不知道有没有我没考虑到的bug,因为似乎过于简单了,或者是因为十年过去了,SAS更新了吗?
  1. data see1;
  2. set see;
  3. m=0;
  4. array x _numeric_ ;/* array是相同类型变量的集合 */
  5. do i=1 to dim(x);/* dim(x)表示数组x中有几个维度(变量) */
  6. if x(i)=. then m=m+1;
  7. end;
  8. run;
复制代码

使用道具

7
乐天天12300 发表于 2023-3-6 17:49:29 |只看作者 |坛友微信交流群
可以考虑使用cmiss(of _all_); 注意此时_all_包括将cmiss返回值赋值给的那个新变量

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 10:45