Sas 当某个子组因子为0时,按组和子组统计行数
我知道如何通过proc freq或sql计算组和子组的数量。我的问题是当子组中缺少某个因子时,我仍然希望将缺少的因子显示为0。我该怎么做?例如 数据集为:Sas 当某个子组因子为0时,按组和子组统计行数,sas,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 如果我只
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个观察值。
在PROFRQ中使用稀疏选项。把它看作是GROP1和GROP2的所有选项之间的交叉连接。
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;
在PROFRQ中使用稀疏选项。将其视为GROP1和GROP2的所有选项之间的交叉连接。
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;
只要每个组在数据中至少表示一次,Reeza的稀疏选项就可以工作。假设有一个group1 3未在您的数据中表示,您仍然希望它们显示在频率表中。如果是这种情况,解决方案是创建一个包含所有类别的参考表,然后将频率表右键连接到它
创建参考表:
data ref;
do group1 = 1 to 3;
group2 = 'A';
output;
group2 = 'B';
output;
end;
run;
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;
使用proc sql创建频率表,右键连接到参考表:
data ref;
do group1 = 1 to 3;
group2 = 'A';
output;
group2 = 'B';
output;
end;
run;
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;
只要每个组在数据中至少表示一次,Reeza的稀疏选项就可以工作。假设有一个group1 3未在您的数据中表示,您仍然希望它们显示在频率表中。如果是这种情况,解决方案是创建一个包含所有类别的参考表,然后将频率表右键连接到它
创建参考表:
data ref;
do group1 = 1 to 3;
group2 = 'A';
output;
group2 = 'B';
output;
end;
run;
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;
使用proc sql创建频率表,右键连接到参考表:
data ref;
do group1 = 1 to 3;
group2 = 'A';
output;
group2 = 'B';
output;
end;
run;
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;
另一个选择是将DWal的“如果数据不在数据中怎么办”问题与Reeza的“一个过程,一个解决方案”结合起来,即“过程列表”。如果格式包含所有可能的值,即使这些值没有出现,它也可以使用printmiss
另一个选择是将DWal的“如果数据不在数据中怎么办”问题与Reeza的“一个过程,一个解决方案”结合起来,即“过程列表”。如果格式包含所有可能的值,即使这些值没有出现,它也可以使用printmiss
如何通过proc summary执行此操作,使用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;
注意,我必须稍微调整have数据集,以确保group2在两个数据集中的长度都为1。如果在classdata=和data=数据集中使用名称相同但长度不同的变量,SAS会抱怨。如何通过proc summary执行此操作,使用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;
注意,我必须稍微调整have数据集,以确保group2在两个数据集中的长度都为1。如果在classdata=和data=数据集中使用名称相同但长度不同的变量,SAS会抱怨。在处理大型数据集时,我更喜欢使用基于proc的方法进行汇总,因为它们避免进行任何排序/索引。在处理大型数据集时,我更喜欢基于proc的方法来进行总结,因为它们避免进行任何排序/索引。