Обязательный заказ для заявлений и опций в рамках процедур SAS - PullRequest
1 голос
/ 24 февраля 2020

Во многих случаях можно выбрать любой порядок операторов и опций в процедурах SAS.

Например, что касается порядка операторов, два следующих PRO C FREQ, в которых порядок операторов BY и TABLES пересекаются, эквивалентны:

PROC SORT DATA=SASHELP.CLASS OUT=class;
    BY Sex;
RUN;

PROC FREQ DATA=class;
    BY Sex;
    TABLES Age;
RUN;
PROC FREQ DATA=class;
    TABLES Age;
    BY Sex;
RUN;

Аналогичным образом, что касается порядка опций, два следующих PRO C PRINT, в которых порядок опций OBS = и FIRSTOBS = перевернуты, эквивалентны:

PROC PRINT DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5);
RUN;
PROC PRINT DATA=SASHELP.CLASS (OBS=5 FIRSTOBS=2 OBS=5);
RUN;

Но есть некоторые исключения.

Например, что касается порядка опций, среди два следующих PRO C PRINT, в которых расположение параметра NOOBS отличается, второй PRO C PRINT, где параметр NOOBS предшествует скобкам, приводит к ошибке, в то время как первый PRO C PRINT правильный :

PROC PRINT DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5) NOOBS;
RUN;
PROC PRINT DATA=SASHELP.CLASS NOOBS (FIRSTOBS=2 OBS=5);
RUN;

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

Хотя вопрос об упорядочении в шагах данных может рассматриваться как совершенно другой вопрос, потому что в шагах данных порядок операторов в большинстве случаев зависит от логики c, способ упорядочения некоторых операторов выглядит отчасти как обычный порядок, как в процедурах; это, например, случай в следующей процедуре слияния, где оператор MERGE должен предшествовать оператору BY; но я полагаю, что SAS мог быть разработан, чтобы понимать эти утверждения в любом порядке:

/* to get a simple example of merge I start with artificially cutting the Class dataset in two parts */
PROC SORT DATA=SASHELP.CLASS OUT=class;
    BY Name;
RUN;
DATA sex_and_age;
   SET class (KEEP=Name Sex Age);
RUN;
DATA height_and_weight;
   SET class (KEEP=Name Height Weight);
RUN;
DATA all_variables;
   MERGE sex_and_age  height_and_weight;
   BY Name;
RUN;

Поскольку я не могу найти такое руководство, мой вопрос: существует ли текст, посвященный вопросу требуемого порядка для заявлений и опций в рамках процедур SAS?

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Джоэл,

Позвольте мне обратиться к примеру с NOOBS, чтобы помочь прояснить ситуацию. 2 утверждения:

PRO C ПЕЧАТЬ ДАННЫХ = SASHELP.CLASS (FIRSTOBS = 2 OBS = 5) NOOBS;

PRO C ПЕЧАТЬ ДАННЫХ = SASHELP .CLASS NOOBS (FIRSTOBS = 2 OBS = 5) ;

Это параметры набора данных, которые влияют на чтение набора данных. Их много, в том числе KEEP, DROP, WHERE и др. c. NOOBS не является набором данных, поэтому вы получаете сообщение об ошибке. Опции набора данных следуют за именем набора данных.

Порядок операторов во многих случаях важен, поскольку он задает PDV (вектор данных программы). Следовательно, почему ATTRIB должен быть на вершине шага данных. Для некоторых процедур это не имеет значения, поскольку все они будут объединены для выполнения.

data test;
   attrib myNewVar   length=$8 format=$20.
          myNewVar2  format=date.
          ;
   set sashelp.class;
   myNewVar = 'Hey Joel!';
   myNewVar2 = '24FEB2020'd;
run;
0 голосов
/ 24 февраля 2020

Ваша первая точка зрения, по-видимому, вызвана непониманием того, каковы параметры набора данных. В противном случае порядок дополнительных частей оператора (например, PRO C PRINT) будет указан в документации для этого оператора.

Во втором пункте кажется, что вы путаете назначение оператора BY в PRO C и оператора BY в шаге данных. На шаге PRO C оператор BY указывает ему обрабатывать данные в группах. На шаге DATA оператор BY должен быть связан с указанным c оператором MERGE / SET / UPDATE.

0 голосов
/ 24 февраля 2020

Список пар имя-значение в скобках после спецификатора набора данных называется параметрами набора данных. Таким образом, вы должны быть в состоянии предвидеть, что будет делать анализатор отправки SAS.

* (...) applies to SASHELP.CLASS;
PROC PRINT DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5);

* (...) are where a option name or options name=value is expected -- error ensues;
PROC PRINT DATA=SASHELP.CLASS NOOBS (FIRSTOBS=2 OBS=5);

* (...) applies to SASHELP.CLASS, NOOBS is in a proper option location within the PROC statement;
PROC PRINT NOOBS DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5);

Любое специальное упорядочение операторов содержится в документации PROC. Некоторые процессы имеют общий синтаксис, и документация перенаправит вас.

...