SAS程序中的语句和选项所需的顺序

SAS程序中的语句和选项所需的顺序,sas,procedure,options,statements,Sas,Procedure,Options,Statements,在许多情况下,可以为SAS过程中的语句和选项选择任何顺序 例如,就语句的顺序而言,以下两种 PROC 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;

在许多情况下,可以为SAS过程中的语句和选项选择任何顺序

例如,就语句的顺序而言,以下两种 PROC 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;
PROC PRINT DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5);
RUN;
PROC PRINT DATA=SASHELP.CLASS (OBS=5 FIRSTOBS=2 OBS=5);
RUN;
以类似的方式,就期权顺序而言,以下两种程序打印(其中OBS=和FIRSTOBS=期权的顺序处于中间位置)是等效的:

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;
PROC PRINT DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5);
RUN;
PROC PRINT DATA=SASHELP.CLASS (OBS=5 FIRSTOBS=2 OBS=5);
RUN;
但也有一些例外

例如,就选项的顺序而言,在以下两个过程打印中,NOOBS选项的位置不同,第二个过程打印(其中NOOBS选项位于括号之前)会导致错误,而第一个过程打印是正确的:

PROC PRINT DATA=SASHELP.CLASS (FIRSTOBS=2 OBS=5) NOOBS;
RUN;
PROC PRINT DATA=SASHELP.CLASS NOOBS (FIRSTOBS=2 OBS=5);
RUN;
类似地,就语句的顺序而言,我偶尔会遇到这样的情况:某个语句必须放在其他语句之前——但不幸的是,我不记得在哪个过程中(可能是统计过程,对于持续时间或多级模型)

虽然数据步骤中的排序问题可能被视为一个完全不同的问题,因为在数据步骤中,语句的顺序在大多数情况下是一个逻辑问题,对某些语句进行排序的方式看起来部分是一个常规排序的问题,就像在程序中一样;例如,在下面的合并过程中,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程序中语句和选项所需顺序问题的文本?

Joel

让我谈谈NOOBS的例子来帮助澄清。两项声明:

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

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

这些是数据集选项,它们会影响数据集的读取。它们有很多种,包括KEEP、DROP、WHERE等。NOOBS不是数据集,因此会出现错误。数据集选项位于数据集名称之后

在许多情况下,语句的顺序很重要,因为它设置了PDV(程序数据向量)。因此,为什么属性应该位于数据步骤的顶部。有些程序,这并不重要,因为它们都将被合并执行

data test;
   attrib myNewVar   length=$8 format=$20.
          myNewVar2  format=date.
          ;
   set sashelp.class;
   myNewVar = 'Hey Joel!';
   myNewVar2 = '24FEB2020'd;
run;

数据集说明符后面的名称=值对的括号列表称为数据集选项。因此,您需要能够预测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
文档中可以找到任何特殊语句顺序。有些程序具有通用语法,文档将重定向您。

您的第一点似乎是因为不了解数据集选项是什么。否则,语句可选部分(如PROC PRINT)的顺序将在该语句的文档中指定


至于第二点,您似乎混淆了PROC中BY语句和数据步骤中BY语句的用途。在PROC步骤中,BY语句告诉它分组处理数据。在数据步骤中,BY语句必须链接到特定的MERGE/SET/UPDATE语句。

感谢您在第一段中提供的见解。你能详细介绍一下你第二段最后两句话中的每一句吗?SAS PDV是如何将数据读入SAS系统并进行操作的。将数据步骤视为while循环。读入PDV的第一个数据设置变量的属性。要控制SAS的功能,请在每个数据步骤的顶部使用ATTRIB,以便您可以自己设置变量的属性。如果数据已在数据集中,则值已设置。您可以通过创建新的数据集来更改它们。如果您正在读取原始数据(使用输入语句,在数据步骤开始时使用ATTRIB设置属性。请参阅YouTube和sas.com以获取PDV信息。Joel,还有一件事。了解PDV对于有效使用sas是绝对关键的。花时间真正了解它。有很多sas全球论坛论文、YouTube视频、sas.com培训材料这说明了PDV。到目前为止,我还没有意识到充分理解PDV的重要性;同样,在我开始写SAS宏时,我没有掌握力学的关键重要性(连续步骤)宏处理。我会听从你的建议。非常感谢!我不清楚你的问题是什么。你的第一点只是对数据集选项语法的误解。不确定第二点是什么。数据步骤本质上是程序,所以语句顺序(操作顺序)肯定会影响它的工作方式。