SAS简单的行数

时间:2014-10-15 19:09:36

标签: count sas

我有一个包含所有状态的大型数据集,目前正在查看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的状态时我都不想改变这段代码。

2 个答案:

答案 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;(每个州只会给你一行,最后一行)。