设置在第一行,为什么我有两个输出行?

时间:2015-07-13 03:50:11

标签: sas

我在SAS中尝试了这段代码,但输出与我预期的不一样。

Double

请问为什么有两个观察结果,sas有两次“设定”?在迭代期间,“set”和PDV如何在这里工作?提前谢谢。

3 个答案:

答案 0 :(得分:4)

因为您在数据步骤结束时执行了两次隐含的OUTPUT。第一次,_N_ = 1,您从输入数据集中读取一个观察值。第二次你没有读过新的观察结果,因为_N_现在是2,并保留了之前观察的值。在第二次观察之后,SAS停止,因为它已检测到您的数据步骤处于循环中。

如果只需要一个观察,则在RUN语句之前添加STOP语句或重新编码数据步骤以在输入数据集上使用OBS = 1数据集选项而不是IF语句。

请注意,如果输入数据集为空,那么您将具有输出零观察值,因为当SET语句读取超过输入数据集的末尾时,数据步骤将停止。

答案 1 :(得分:2)

有两个观察结果,因为在第二个DATA步骤迭代期间没有发生读取操作。

SET语句有两个角色。

  1. 编译时角色(无条件) - 编译器读取数据集头,并将其变量添加到PDV步骤中。
  2. 运行时角色(条件) - 读取数据集中的一行,每次代码到达SET语句时,值都放在PDV中。
  3. 此外,来自(或对应于)SET语句的每个变量都会自动保留它的值。这就是为什么示例代码创建的第二个观察结果为sumy=36

    SAS support site的其他详细信息:

      

    使用说明8914:由于循环消息

    ,数据步骤停止      

    如果写入DATA步骤使得没有数据读取语句(例如,   执行SET,INPUT),一次迭代后终止步骤   并将以下消息写入SAS日志:

         

    注意:数据STEP因循环而停止。

答案 2 :(得分:0)

当SAS创建新数据集时,它一次读取一条记录,将该记录中的值保存在程序数据向量(PDV)中,直到下一条记录中的值替换它们。 SAS继续这样做,直到它达到最后的记录。

您可以参考此链接以便更好地理解

http://www.lexjansen.com/nesug/nesug07/cc/cc45.pdf

此外,您可以在堆栈溢出

上查看此答案

SAS . Are variables set to missing at every iteration of a data step?