我有以下内容:
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)其他??
我觉得这显然是一个常见的问题,必须有一个干净,简单的方法,我只是不知道它是什么。
答案 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)我对一行是否有任何缺失不感兴趣,因为这些是非常频繁的,我想保留它们。相反,我只想让输出区分缺失和总计,我通过将非缺失的实例重命名为指示总数的东西来完成。