我知道如何通过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个观察结果。
答案 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会抱怨。