Как определить, сколько наблюдений в наборе данных (или, если он пуст), в SAS? - PullRequest
18 голосов
/ 14 апреля 2011

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

Чтобы я мог написать оператор If, чтобы установить некоторые условия.

Спасибо.

Ответы [ 7 ]

18 голосов
/ 14 апреля 2011

Это легко с PROC SQL.Сделайте подсчет и поместите результаты в макропеременную.

proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;
14 голосов
/ 14 апреля 2011

Есть много разных способов, я склонен использовать макро-функции с open() и attrn(). Ниже приведен простой пример, который прекрасно работает большую часть времени. Если вы собираетесь работать с представлениями данных или более сложными ситуациями, такими как набор данных с записями, помеченными для удаления или активными предложениями where, то вам может потребоваться более надежная логика.

%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);
8 голосов
/ 14 апреля 2011

Вот более полный пример, о котором говорил @cmjohns.Он вернет 0, если он пустой, -1, если он отсутствует, и имеет опции для обработки удаленных наблюдений и предложений where (обратите внимание, что использование выражения where может заставить макрос долго работать с очень большими наборами данных).

Замечания по использованию:

Этот макрос вернет количество наблюдений в наборе данных.Если набор данных не существует, то будет возвращено -1.Я бы не рекомендовал это для использования с именами библиотек ODBC, используйте его только для таблиц SAS.

Параметры:

  • iDs - libname.dataset, который вы хотите проверить.
  • iWhereClause ( Необязательно ) - А где применяется условие
  • iNobsType ( Необязательно ) - Либо 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 AutoCall Library и поместив этот макрос в ваше местоположение авто-вызова.

3 голосов
/ 29 июня 2013

Proc sql не эффективен, когда у нас большой набор данных.Хотя использование ATTRN является хорошим методом, но это может быть достигнуто в рамках базового sas, вот эффективное решение, которое может дать количество obs даже миллиардов строк, просто читая одну строку:

data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;
1 голос
/ 13 сентября 2016

Полагаю, я пытаюсь заново изобрести колесо с таким количеством ответов.Но я вижу некоторые другие методы, которые пытаются сосчитать из фактического набора данных - это может занять много времени для огромных наборов данных.Вот более эффективный метод:

proc sql;
select nlobs from sashelp.vtable where libname = "library" and memname="dataset";
quit;
1 голос
/ 10 ноября 2015

Немного другой подход:

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.

1 голос
/ 12 мая 2014

Трюк производит вывод, даже если набор данных пуст.

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 может быть сложным, но вышеописанное может работать для простых приложений.

...