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

问题描述 投票:1回答:3

在许多情况下,您可以在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是等效的,其中OBS =和FIRSTOBS =选项的顺序是颠倒的:

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

但是有一些例外。

例如,就选项的顺序而言,在以下两个PROC PRINT中,NOOBS选项的位置不同,在第二个PROC PRINT中,NOOBS选项在括号之前,会导致错误而第一个PROC PRINT是正确的:

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程序中语句和选项的所需顺序问题的文本?

sas procedure options statements
3个回答
1
投票

乔,

让我讲一下NOOBS示例以帮助阐明。 2条语句:

PROC打印数据= SASHELP.CLASS (FIRSTOBS = 2 OBS = 5) NOOBS;

PROC打印数据= SASHELP.CLASS NOOBS (FIRSTOBS = 2 OBS = 5);

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

在许多情况下,语句的顺序很重要,因为它设置了PDV(程序数据向量)。因此,为什么应将ATTRIB放在数据步骤的顶部。某些proc无关紧要,因为它们将全部合并以执行。


0
投票

在数据集说明符之后的名称=值对的括号列表称为数据集选项。因此,您需要能够预测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具有通用语法,文档会重定向您。


0
投票

您的第一点似乎是由于不了解什么是数据集选项引起的。

第二点看来,您正在混淆PROC中的BY语句和数据步骤中的BY语句。

© www.soinside.com 2019 - 2024. All rights reserved.