cmiss与nmiss函数的区别

来源:互联网 发布:男科医院网络预约挂号 编辑:程序博客网 时间:2024/05/29 15:13

cmiss与nmiss函数的区别: 两者都是用来对缺失个数进行统计,两者区别就在于前者既能用于数值型也能用于字符型,而nmiss则只能用于数值型。

The CMISS function does not convert any argument. The NMISS function converts all arguments to numeric values.
cmiss在计算缺失值的时候,不会对参数进行转换,而nmiss则会把所有的参数转换为数值然后来计算缺失值。

例1:
data survey;
    input id diet exer hours xwk $ educ $;
    total_miss=nmiss(diet,exer,hours,xwk,educ);
datalines;
1 1 . 1 A . 
1 . 2 B C 2
1 . D . . .
1 1 E F * .
2 . 9 & 3 .
2 5 9 2 4 .
2 . 3 . 5 3
3 2 . . . .
;

例2:
data survey;
    input id diet exer hours xwk $ educ $;
    total_miss=cmiss(diet,exer,hours,xwk,educ);
datalines;
1 1 . 1 A . 
1 . 2 B C 2
1 . D . . .
1 1 E F * .
2 . 9 & 3 .
2 5 9 2 4 .
2 . 3 . 5 3
3 2 . . . .
;

在使用这两个函数的过程中,我们往往会发现在统计缺失个数时候,经常出现实际计算出来的值要大于缺失值的个数,这是为什么呢?
举个简单的例子:
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;
原创粉丝点击