区分proc的输出中的缺失和总数意味着什么?

时间:2014-01-20 19:08:28

标签: sas

我有以下内容:

proc means data = ... missing;
class 1 2 3 4 5;
var a b;
output sum=;
run;

这就是我想要它做的事情,除了很难区分代表总数的缺失值和代表缺失值的缺失值。例如,以下内容将出现在我的输出中:

1 2 3 4 5 type sumA sumB
. . . . . 0 num num
. . . . . 1 num num

我能想到如何处理这个问题:

1)在proc之前将缺失更改为基数值。这绝对可行......但不完全干净。

2)先将missing格式化为其他内容,然后使用preloadfmt?这有点痛苦......我真的不愿意。

3)以某种方式使用proc means-generated变量类型来确定缺失是缺失还是总

4)其他??

我觉得这显然是一个常见的问题,必须有一个干净,简单的方法,我只是不知道它是什么。

2 个答案:

答案 0 :(得分:1)

选项3,当然。 Type只是一个二进制数,每个类变量的顺序为1,包含在当前行中,0表示每个缺失的变量。您可以使用CHARTYPE选项要求将其明确地作为字符串('01101110'等)给出,或者如果更符合您的风格,则使用数学。

你究竟如何使用这取决于你想要完成的任务。对它们有缺失值的行将具有一个类型,该类型表明应该存在类变量,但不存在。例如:

data want;
set have; *post-proc means assuming used CHARTYPE option;
array classvars a b c d e;  *whatever they are;
hasmissing=0;
do _t = 1 to dim(classvars);
  if char(_type_,_t) = 1 and classvars[_t] = . then hasmissing=1;
end;
*or;
if cmiss(of classvars[*]) = countc(_type_,'0') then hasmissing=0;
else hasmissing=1; *number of 0s = number of missings = total row, otherwise not;
run;

当然,这是一个蛮力的应用程序。如果您请求的类型数量很少,您也可以根据缺失次数识别它。例如,假设您有3个类变量(类型为0到7个值),并且您只要求3路组合(7,'111')和3双向组合'总计'(6,5, 3,即'110','101','011')。然后:

data want;
set have;
if (_type_=7 and cmiss(of a b c) = 0) or (cmiss(of a b c) = 1) then ... ; *either base row or total row, no missings;
else ... ; *has at least one missing;
run;

根据您的数据,NMISS也可以使用。检查错误的数量是否适合数据类型。

答案 1 :(得分:1)

Joe的策略,针对我的确切问题进行了略微修改,因为它可能在将来的某个时候对某些人有用。

data want;
set have;
array classvars a b c d e;
do _t = 1 to dim(classvars);
  if char(_type_,_t) = 1 and (strip(classvars[_t] = "") or strip(classvars[_t]) = ".") then classvars[_t] = "TOTAL";
end;
run;

变更的理由如下:

1)我正在使用(主要是)字符变量,而不是数字。

2)我对一行是否有任何缺失不感兴趣,因为这些是非常频繁的,我想保留它们。相反,我只想让输出区分缺失和总计,我通过将非缺失的实例重命名为指示总数的东西来完成。