我有一个包含所有状态的大型数据集,目前正在查看NE。我正在分别查看每个州,我想计算每个州中包含的行数。我目前正在使用:
record_num = _N_;
但是这给了我包含NE的第一行的行数。例如,第49752行是第一个record_num:
49752
49753
49754
49756
49757
49758
我想:
1
2
3
4
5
6
我希望它等于1。我能做到:
record_num=_N_;
num = record_num-49751;
但是每次我改变改变record_num的状态时我都不想改变这段代码。
答案 0 :(得分:2)
@ Joe的答案的更多替代方案。您可以使用proc means
计算每个州的行数。我以sashelp.zipcode数据集为例。 nway
选项告诉它按class
语句中的所有变量进行汇总。输出语句中的n=
选项告诉它只计算类变量的观察数(您还可以选择其他聚合函数,如均值,和等)。
proc means data=sashelp.zipcode nway missing noprint;
class statecode;
output out=want(keep=statecode _freq_) n=;
quit;
这也是我个人最喜欢的SQL方法,因为它是一种可以在多种编程语言中使用的广泛理解的语法:
proc sql noprint;
create table want as
select statecode,
count(*) as num_records
from sashelp.zipcode
group by 1
order by 1
;
quit;
答案 1 :(得分:1)
SAS分组处理是您需要使用的。
例如:
data want;
set have;
by state;
if first.state then counter=0;
counter+1;
run;
当STATE发生更改时,更改前的最后一条记录的变量LAST.STATE
设置为1(否则为0),下一条记录(第一条为新值的状态)变量FIRST.STATE
设置为1(否则为0)。
因此,每次遇到新状态时,我们将计数器设置为0,并将其递增(var+1;
递增变量并将其保留在行之间。)
如果您只想要实际计数,如评论中的vasja注释,那么在运行之前添加if last.state;
(每个州只会给你一行,最后一行)。