Sas 当某个子组因子为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 如果我只

我知道如何通过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个观察值。

在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的方法来进行总结,因为它们避免进行任何排序/索引。