Существует ли способ обнаружить при достижении последнего наблюдения на шаге ДАННЫХ SAS?

На самом деле Ваш вопрос не плох. Я играл с универсальным языком программирования в течение последних нескольких лет и хотя я никогда не возвращался, на самом деле разрабатывают его (и вероятно никогда не будет), я думал много об универсальном выводе типа, и один из моих высших приоритетов должен был всегда позволять конструкцию классов, не имея необходимость определять универсальный тип.

C# просто испытывает недостаток в ряду правил для создания этого возможным. Я думаю, что разработчики никогда не видели neccesity для включения этого. На самом деле следующий код был бы очень близко к Вашему суждению и решил бы проблему. Все потребности C# являются добавленной поддержкой синтаксиса.

class Foo<T> {
    public Foo(T x) { … }
}

// Notice: non-generic class overload. Possible in C#!
class Foo {
    public static Foo<T> ctor<T>(T x) { return new Foo<T>(x); }
}

var x = Foo.ctor(42);

, Так как этот код на самом деле работает, мы показали, что проблемой не является одна из семантики, но просто одна из недостающей поддержки. Я предполагаю, что должен забрать свою предыдущую регистрацию.;-)

16
задан chucknelson 28 September 2009 в 16:22
поделиться

4 ответа

The nobs= option to a set statement can give you the number of observations. When the data step is compiled, the header portion of the input datasets are scanned, so you don't even have to execute the set statement in order to get the number of observations. For instance, the following reports 2 as expected:

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

The end= option sets a flag when the last observation (for the set statement) is read in.

A SAS data set, however, can be a SAS data file or a SAS view. In the case of the latter, the number of observations may not be known either at compile time or at execution time.

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
*/
20
ответ дан 30 November 2019 в 16:14
поделиться

Вы также можете использовать % 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;
10
ответ дан 30 November 2019 в 16:14
поделиться

Найдите количество наблюдений в наборе данных 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;

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

7
ответ дан 30 November 2019 в 16:14
поделиться
data hold;   
  set input_data end=last;    
    .    
    .   
    .   
  if last then do;   
    .   
    .   
    .   
  end;  
run;
5
ответ дан 30 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: