Подтвердить что ты не робот

Как определить, сколько наблюдений в наборе данных (или если оно пустое), в SAS?

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

Так что я могу написать оператор If для установки некоторых условий.

Спасибо.

4b9b3361

Ответ 1

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

proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;

Ответ 2

Есть много разных способов, я имею тенденцию использовать макрофункцию с 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);

Ответ 3

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

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

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

Параметры:

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

Ответ 4

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

data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;

Ответ 5

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

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

Ответ 6

Несколько иной подход:

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.

Ответ 7

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

proc sql;
select nlobs from sashelp.vtable where libname = "library" and memname="dataset";
quit;