Есть ли способ обнаружить, когда вы достигли последнего наблюдения на шаге SAS DATA?

Есть ли способ проверить, сколько наблюдений находится в наборе данных SAS во время выполнения ИЛИ, чтобы определить, когда вы достигли последнего наблюдения на этапе DATA?

Я не могу найти ничего в Интернете для этой, казалось бы, простой проблемы. Спасибо!

Ответы

Ответ 1

Опция nobs= для оператора set может дать вам количество наблюдений. Когда шаг данных компилируется, часть заголовка входных наборов данных сканируется, поэтому вам даже не нужно выполнять оператор set, чтобы получить количество наблюдений. Например, следующие отчеты 2, как ожидалось:

/* 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
*/

Параметр end= устанавливает флаг, когда считывается последнее наблюдение (для оператора set).

Однако набор данных SAS может быть файлом данных SAS или представлением SAS. В случае последнего количество наблюдений может быть неизвестно ни во время компиляции, ни во время выполнения.

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
*/

Ответ 2

Вы также можете использовать %sysfunc(attrn( dataset, nlobs)), хотя он ограничен наборами данных SAS (т.е. не представлениями данных). Кредит для макроса этот документ SUGI, который также дает отличную информацию о хорошем макропроекте.

В наборе данных SAS можно получить всевозможные символы и числовые данные.

Смотрите документацию на attrn и 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;

Ответ 3

Найдите количество наблюдений в наборе данных SAS:

proc sql noprint;
  select count(*) into: nobs
  from sashelp.class
  ;
quit;

data _null_;
  put "&nobs";
run;

Часть SQL подсчитывает количество наблюдений и сохраняет число в макропеременной, называемой "nobs". Шаг данных помещает номер для отображения, но вы можете использовать макро переменную, как и любую другую.

Выполнение определенного действия при обработке последнего наблюдения:

data _null_;
  set sashelp.class end=eof;
  if eof then do;
     put name= _n_=;
  end;
run;

Опция "конец" для оператора "set" определяет переменную (здесь "eof" для конца файла), которая установлена ​​в 1, когда обрабатывается последнее наблюдение. Затем вы можете проверить значение переменной и выполнить действия, когда ее значение равно 1. Для получения дополнительной информации см. Документацию для оператора "set".

Ответ 4

data hold;   
  set input_data end=last;    
    .    
    .   
    .   
  if last then do;   
    .   
    .   
    .   
  end;  
run;