Есть ли способ обнаружить, когда вы достигли последнего наблюдения на шаге 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;