Ответ 1
Легко с PROC SQL. Сделайте счет и поместите результаты в макро переменную.
proc sql noprint;
select count(*) into :observations from library.dataset;
quit;
Интересно, существует ли способ определить, пуст ли набор данных, т.е. он не имеет никаких наблюдений. Или в другом высказывании, как получить количество наблюдений в определенном наборе данных.
Так что я могу написать оператор If для установки некоторых условий.
Спасибо.
Легко с PROC SQL. Сделайте счет и поместите результаты в макро переменную.
proc sql noprint;
select count(*) into :observations from library.dataset;
quit;
Есть много разных способов, я имею тенденцию использовать макрофункцию с open()
и attrn()
. Ниже приведен простой пример, который отлично работает большую часть времени. Если вы собираетесь иметь дело с представлениями данных или более сложными ситуациями, такими как наличие набора данных с записями, отмеченными для удаления или активными в тех случаях, когда выставлять предложения, тогда вам может понадобиться более надежная логика.
%macro nobs(ds);
%let DSID=%sysfunc(OPEN(&ds.,IN));
%let NOBS=%sysfunc(ATTRN(&DSID,NOBS));
%let RC=%sysfunc(CLOSE(&DSID));
&NOBS
%mend;
/* Here is an example */
%put %nobs(sashelp.class);
Вот более полный пример, о котором говорил @cmjohns. Он будет возвращать 0, если он пуст, -1, если он отсутствует, и имеет опции для обработки удаленных наблюдений и где предложения (обратите внимание, что использование предложения where может сделать макрос долгое время на очень больших наборах данных).
Замечания по использованию:
Этот макрос вернет количество наблюдений в наборе данных. Если набор данных не существует, то возвращается -1. Я бы не рекомендовал это для использования с именами ODBC lib, используйте его только против таблиц SAS.
Параметры:
libname.dataset
, который вы хотите проверить.NOBS
ИЛИ NLOBSF
. Для описания см. документацию SASV9.Определение макроса:
%macro nobs(iDs=, iWhereClause=1, iNobsType=nlobsf, iVerbose=1);
%local dsid nObs rc;
%if "&iWhereClause" eq "1" %then %do;
%let dsID = %sysfunc(open(&iDs));
%end;
%else %do;
%let dsID = %sysfunc(open(&iDs(where=(&iWhereClause))));
%end;
%if &dsID %then %do;
%let nObs = %sysfunc(attrn(&dsID,nlobsf));
%let rc = %sysfunc(close(&dsID));
%end;
%else %do;
%if &iVerbose %then %do;
%put WARNING: MACRO.NOBS.SAS: %sysfunc(sysmsg());
%end;
%let nObs = -1;
%end;
&nObs
%mend;
Пример использования
%put %nobs(iDs=sashelp.class);
%put %nobs(iDs=sashelp.class, iWhereClause=height gt 60);
%put %nobs(iDs=this_dataset_doesnt_exist);
Результаты
19
12
-1
Установка
Я рекомендую создать библиотеку автозапуска SAS и поместить этот макрос в местоположение автозагрузки.
Proc sql не эффективен, когда у нас есть большой набор данных. Хотя использование ATTRN - хороший метод, но это может быть достигнуто в базовом sas, вот эффективное решение, которое может дать число общности даже миллиардов строк, просто прочитав одну строку:
data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;
Трюк создает выход, даже когда набор данных пуст.
data CountObs;
i=1;
set Dataset_to_Evaluate point=i nobs=j; * 'point' avoids review of full dataset*;
No_of_obs=j;
output; * Produces a value before "stop" interrupts processing *;
stop; * Needed whenever 'point' is used *;
keep No_of_obs;
run;
proc print data=CountObs;
run;
Вышеприведенный код является самым простым способом, который, как я нашел, вызывает количество наблюдений, даже когда набор данных пуст. Я слышал, что NOBS может быть сложным, но вышеприведенное может работать для простых приложений.
Несколько иной подход:
proc contents data=library.dataset out=nobs;
run;
proc summary data=nobs nway;
class nobs;
var delobs;
output out=nobs_summ sum=;
run;
Это даст вам набор данных с одним наблюдением; переменная nobs имеет значение количества наблюдений в наборе данных, даже если оно равно 0.
Наверное, я пытаюсь изобрести колесо здесь с таким количеством ответов. Но я вижу некоторые другие методы, которые пытаются подсчитать из фактического набора данных - это может занять много времени для огромных наборов данных. Вот более эффективный метод:
proc sql;
select nlobs from sashelp.vtable where libname = "library" and memname="dataset";
quit;