Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to detect when you've reached the last observation in a SAS DATA step?

Tags:

sas

Is there a way to check how many observations are in a SAS data set at runtime OR to detect when you've reached the last observation in a DATA step?

I can't seem to find anything on the web for this seemingly simple problem. Thanks!

like image 518
chucknelson Avatar asked Sep 28 '09 16:09

chucknelson


People also ask

How do I get the last observation in SAS?

The END= last option tells SAS to create a temporary numeric variable called last , which is initialized to 0 and set to 1 only when the SET statement reads the last observation in the input data set.

How does SAS determine last variable?

variable is 0. When an observation is the last in a BY group, SAS sets the value of LAST. variable to 1. This happens when the value of the variable changes in the next observation.

What does EOF mean in SAS?

End-of-file processing in a SAS® DATA step occurs when an entire file is read and some specific processing takes place only after the last record is read from the dataset being processed.

How do you find the presence of a variable in SAS?

Re: How to know whether a variable exists in a dataset Check for the existence of a specified variable. or the variable is not in the specified data set. Use SYSFUNC to execute OPEN, VARNUM, and CLOSE functions. %let dsid = %sysfunc(open(&ds));


2 Answers

The nobs= option to a set statement can give you the number of observations. When the data step is compiled, the header portion of the input datasets are scanned, so you don't even have to execute the set statement in order to get the number of observations. For instance, the following reports 2 as expected:

/* a test data set with two observations and no vars */
data two;
  output;
  output;
run;

data _null_;
  if 0 then set two nobs=nobs;
  put nobs=;
run;
/* on log
nobs=2
*/

The end= option sets a flag when the last observation (for the set statement) is read in.

A SAS data set, however, can be a SAS data file or a SAS view. In the case of the latter, the number of observations may not be known either at compile time or at execution time.

data subclass/view=subclass;
  set sashelp.class;
  where sex = symget("sex");
run;

%let sex=F;
data girls;
  set subclass end=end nobs=nobs;
  put name= nobs= end=;
run;
/* on log
Name=Alice nobs=9.0071993E15 end=0
Name=Barbara nobs=9.0071993E15 end=0
Name=Carol nobs=9.0071993E15 end=0
Name=Jane nobs=9.0071993E15 end=0
Name=Janet nobs=9.0071993E15 end=0
Name=Joyce nobs=9.0071993E15 end=0
Name=Judy nobs=9.0071993E15 end=0
Name=Louise nobs=9.0071993E15 end=0
Name=Mary nobs=9.0071993E15 end=1
*/
like image 126
Chang Chung Avatar answered Oct 11 '22 11:10

Chang Chung


You can also use %sysfunc(attrn( dataset, nlobs)) though it is limited to SAS data sets (i.e. not data views). Credit for the macro to this SUGI paper, which also give great information regarding good macro design.

You can get all sorts of other character and numeric information on a SAS data set.

See the documentation on attrn and attrc.

%macro numobs (data=&syslast ) ;
/* --------------------------------------------
Return number of obs as a function
--------------------------------------------
*/
%local dsid nobs rc;
%let data = &data ; /* force evaluation of &SYSLAST */
%let dsid=%sysfunc(open(&data));
%if &dsid > 0 %then
%do ;
   %let nobs=%sysfunc(attrn(&dsid,nlobs));
   %let rc=%sysfunc(close(&dsid));
%end ;
%else
   %let nobs = -1 ;
&nobs
%mend numobs;
like image 31
cmjohns Avatar answered Oct 11 '22 12:10

cmjohns