登录
首页精彩阅读关于缺失统计函数cmiss、nmiss中的小细节
关于缺失统计函数cmiss、nmiss中的小细节
2017-04-03
收藏

关于缺失统计函数cmiss、nmiss中的小细节

数据清理中统计缺失变量的缺失的时候,我们经常会用到cmiss函数和nmiss函数,这两者都是用来对缺失个数进行统计,两者区别就在于前者既能用于数值型也能用于字符型,而nmiss则只能用于数值型。

在使用这两个函数的过程中,我们往往会发现在统计缺失个数时候,经常出现实际计算出来的值要大于缺失值的个数,这是为什么呢?

举个简单的例子:

data tmp;

v1=.;v2='';x=3;output;

v1=1;v2='A';x=2;output;

v1=3;v2='';x=.;output;

v1=.;v2='B';x=2;output;

run;

我们得到四行数据,如下所示:
 

接下来用cmiss函数进行行缺失个数的统计:

data tmp1;

set tmp;

sum_miss=cmiss(of _all_);

run;

最终得到如下结果:


我们发现sum_miss的每一行值都比实际值要大1,为了了解这个过程,我们来通过put语句展示一下过程:

data tmp1;

set tmp;

put _all_;

sum_miss=cmiss(of _all_);

run;

查看日志:


我们发现在统计行缺失时,由于使用的_all_,所以把sum_miss变量也包含进去了,所以才会产生如上结果。

那么为了避免出现这种结果,我们可以用两种办法:

第一种:对sum_miss赋值,例如:

data tmp1;

set tmp;

sum_miss = 0;

sum_miss=cmiss(of _all_);

run;


第二种:将变量列出来,例如:


data tmp1;

set tmp;

sum_miss=cmiss(v1,v2,x);

run;


但是通常情况下,我们还是习惯用第一种方法,因为有时候变量太多,我们又不希望把他们都列出来,所以喜欢采用_all_来表示所有变量。

有童鞋也许会问了,如果我变量很多,但是我又只想对一部分变量进行行缺失统计,那么我该怎么做呢?

方法也很多:

例如可以选择第二种方法,只是需要将你要选择的那些变量用宏变量把他们包含成一列:sum_miss = cmiss(of ¯o_var.);其中宏变量macro_var = v1 v2 x;。

例如可以选择第一种方法,只是在set数据集时,将需要的都keep,前提还是需要将他们用宏变量包含城一列。

等等,根据具体情况,只要灵活结合宏,往往我们都能得到事半功倍的效果。

另外使用cmiss还要一个地方需要注意:

在将cmiss与%sysfunc结合使用时,需要注意对于宏变量是缺失的,我们要用(.)来表示,而不能用空格来表示,例如:

%let a = ;

%let b = hello;

%let c = %sysfunc(cmiss(&a.,&b.));

%put c = &c.;

我们可以看到日志中如下所示:


虽然最终得到了正确的结果,但是程序还是会报错。

那么为了消除这个error,我们需要在宏变量后面再加上一个点号,如下所示:

%let a = ;数据分析师培训

%let b = hello;

%let c = %sysfunc(cmiss(&a..,&b..));

%put c = &c.;

最终在日中中,我们会发现这个error已经去掉了。


数据分析咨询请扫描二维码

客服在线
立即咨询