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时出现