当某个子组因子为0时,按组和子组计算行数

时间:2015-03-03 01:19:04

标签: sas

我知道如何通过proc freq或sql计算组和子组号。我的问题是当子组中的某些因素丢失时,我仍然希望将缺失因子显示为0.我该怎么做?例如, 数据集是:

group1 group2
1      A
1      A
1      A
1      A
2      A
2      B
2      B

我想要一个结果:

group1 group2 N
1      A      4
1      B      0
2      A      1
2      B      2

如果我只使用默认的SAS设置,它通常会显示为

group1 group2 N
1      A      4
2      A      1
2      B      2

但我仍然希望结果中的第二行告诉我该类别中有0个观察结果。

4 个答案:

答案 0 :(得分:6)

在proc freq中使用SPARSE选项。将其视为GROUP1和GROUP2中所有选项之间的交叉连接。

data have;
input group1 group2 $;
cards;
1 A
1 A
1 A
1 A
2 A
2 B
2 B
;
run;

proc freq data=have;
table group1*group2/out=want sparse;
run;

proc print data=want;
run;

答案 1 :(得分:3)

只要每个组至少在您的数据中显示一次,Reeza的sparse选项就会起作用。假设您的数据中没有表示group1 3,您仍然希望它们显示在频率表中。如果是这种情况,解决方案是创建一个包含所有类别的参考表,然后将频率表加入其中。

创建参考表:

data ref;
  do group1 = 1 to 3;
    group2 = 'A';
    output;
    group2 = 'B';
    output;
  end;
run;

使用proc sql创建频率表,右键连接到参考表:

proc sql;
select
  r.group1,
  r.group2,
  count(h.group1) as freq
from
  have h
  right join ref r
  on h.group1 = r.group1
  and h.group2 = r.group2
group by
  r.group1,
  r.group2
order by
  r.group1,
  r.group2
;
quit;

答案 2 :(得分:3)

另一个选项是DWal的“如果数据不在数据中会怎么样”和Reeza的One Proc,One Solution之间的交叉是proc tabulate。如果格式包含所有可能的值,即使未显示值,也可以使用printmiss

proc format;
value groupformat
    1='Group 1'
    2='Group 2'
    3='Group 3'
    ;
quit;

data have;
input group1 group2 $;
cards;
1 A
1 A
1 A
1 A
2 A
2 B
2 B
;
run;

proc tabulate data=have;
  class group1 group2/preloadfmt;
  format group1 groupformat.;
  tables group1*group2,n/printmiss misstext='0';
run;

答案 3 :(得分:1)

如何通过proc摘要执行此操作,使用DWal的参考表指定要使用的值组合:

data ref;
  do group1 = 1 to 3;
    group2 = 'A';
    output;
    group2 = 'B';
    output;
  end;
run;

data have;
input group1 group2 $1.;
cards;
1 A
1 A
1 A
1 A
2 A
2 B
2 B
;
run;

proc summary nway data = have classdata=ref;
    class group1 group2;
    output out = summary (drop = _TYPE_);
run;

N.B。我不得不稍微调整have数据集,以确保group2在两个数据集中的长度均为1。如果您在classdata=data=数据集中使用名称相同但长度不同的变量,SAS会抱怨。