Sas 计数0个值的数目

Sas 计数0个值的数目,sas,Sas,与之类似,我可以计算缺失观察的数量: data dataset; input a b c; cards; 1 2 3 0 1 0 0 0 0 7 6 . . 3 0 0 0 . ; run; proc means data=dataset NMISS N; run; 但是我如何计算0的观察数呢?如果要计算0的观察数,您需要使用proc tablate或proc freq,并进行频率计数 如果您有很多值,并且只想要“0/而不是0”,那么使用格式很容易做到这一点 data have; i

与之类似,我可以计算缺失观察的数量:

data dataset;
  input a b c;
cards;
1 2 3
0 1 0
0 0 0
7 6 .
. 3 0
0 0 .
;
run;

proc means data=dataset NMISS N;
run;

但是我如何计算
0
的观察数呢?

如果要计算0的观察数,您需要使用
proc tablate
proc freq
,并进行频率计数

如果您有很多值,并且只想要“0/而不是0”,那么使用
格式
很容易做到这一点

data have;
  input a b c;
cards;
1 2 3
0 1 0
0 0 0
7 6 .
. 3 0
0 0 .
;
run;

proc format;
  value zerof
  0='Zero'
  .='Missing'
  other='Not Zero';
quit;

proc freq data=have;
  format _numeric_ zerof.;
  tables _numeric_/missing;
run;

沿着这些路线的东西。显然,要小心使用
\u numeric\u
,因为这都是数值变量,如果有很多,可能会很快变得混乱…

最容易使用的
PROC-SQL
。您必须使用
联合
来复制
方法
输出

第一个
FROM
的每个部分对每个变量的0值进行计数,并将其堆叠起来

最后一节仅统计
数据集中的观察数

proc sql;
select n0.Variable, 
       n0.N_0 label="Number 0", 
       n.count as N
 from (
   select "A" as Variable,
          count(a) as N_0
      from dataset
      where a=0
   UNION 
   select "B" as Variable,
          count(b) as N_0
      from dataset
      where b=0
   UNION
   select "C" as Variable,
          count(c) as N_0
      from dataset
      where c=0
) as n0,
(
    select count(*) as count
    from dataset
) as n;
quit;

我补充这一点作为补充回答。它要求您具有
PROC IML

这使用矩阵操作进行计数

(ds=0)
——创建一个包含0/1个值(假/真)的矩阵,其中值为0

[+,]
——对所有列的行求和。如果我们有0/1个值,那么这是每个列的值=0的数目

——运算符是转置

||
——合并矩阵{0}|{1}={01}

然后我们只打印值

proc iml;
use dataset;
read all var _num_ into ds[colname=names];
close dataset;
ds2 = ((ds=0)[+,])`;

n = nrow(ds);

ds2 = ds2 || repeat(n,ncol(ds),1);

cnames = {"N = 0", "Count"};
mattrib ds2 rowname=names colname=cnames;

print ds2;
quit;

proc freq中有级别选项可供使用

proc freq data=dataset levels;
table _numeric_;
run;

顺便说一下,瑞克的文章和第二部分很相似。我不确定我会认为所有的打字都很简单。我会把它放在宏IRL中。