Sas 计算组中的观察次数

Sas 计算组中的观察次数,sas,Sas,我的数据集如下: ID status 101 Checked 101 Checked 101 NotChecked 101 Checked 101 NotChecked 我想在状态变量上计算obs基的数量,如 ID status Count 101 Checked 2 101 Checked 2 101 NotChecked 1 101 Checked 1 101 NotChecked 1 我不想使用proc sql,因为当我

我的数据集如下:

ID status 
101 Checked
101 Checked
101 NotChecked
101 Checked
101 NotChecked
我想在状态变量上计算obs基的数量,如

ID status        Count
101 Checked       2
101 Checked       2 
101 NotChecked    1
101 Checked       1
101 NotChecked    1

我不想使用proc sql,因为当我说group by then时,它会对数据集进行排序,并给出状态变量未排序的结果。

按组聚合总是需要排序,除非您想使用一些复杂的数据步骤逻辑

如果要保持特定的排序顺序,最简单的方法是创建一个包含所需顺序的键列。在分组后,您可以将其恢复到您希望的方式

data have2;
    set have;
    varorder = _N_;
run;

proc sql;
    create table want as
        select id, status, count(*) as count
        from have2
        group by id, status
        order by varorder
    ;
quit;

这对我来说很有效,有点长,但基本上是添加行和组标识符来控制计数。BY语句上的NOTSORTED选项有助于唯一地标识组

data have;
input ID status $12.;
cards;
101 Checked
101 Checked
101 NotChecked
101 Checked
101 NotChecked
;;;;
run;

data grouped;
set have;
by id status notsorted;
retain MyGroups count;
if first.id then count=1;
else count+1;
if first.status then MyGroups+1;
run;

proc sql;
create table want as
select *, count(*) as numberFound
from grouped
group by MyGroups
order by ID, count;
quit;

为什么第三条记录是1而不是2?@Reeza的想法是计算具有相同状态的连续记录,第三条记录被切掉,第四条记录再次被检查,因为它只在被计算为1时出现