代码之家  ›  专栏  ›  技术社区  ›  Andrew Haynes

一个或多个数据步输出语句是如何工作的,它可以是隐式的吗?

sas
  •  1
  • Andrew Haynes  · 技术社区  · 8 年前

    在SAS中运行数据步骤时,为什么输出语句似乎“停止”了set语句的迭代?

    我需要有条件地输出重复的观察结果。虽然我可以使用大量的输出语句,但我想知道SAS是否执行了正常的迭代,而输出只是创建了一个额外的观察。

    1) 做 run SAS中的语句具有内置 output 陈述(sum语句具有内置 retain )

    2) 当我要求SAS输出某些观察结果时发生了什么?特别是在 set 陈述它是否会设置所有值,直到满足条件,然后只保留我请求的值?或者它是否与其他语句有某种类似之处,例如 point= 陈述

    3) 是否有类似的声明 输出 这将继续设置前一数据步骤的值,然后在请求时输出附加观察值?

    例如:

    data test;
      do i = 1 to 100;
      output;
      end;
    run;
    
    data test2;
      set test;
      if _N_ in (4 8 11) then output;
    run;
    
    data test3;
      set test;
      if _N_ in (4 8 11) then output;
      output;
    run;
    

    测试有100个观察,测试2有3个观察,而测试3有103个观察。这让我认为,对于运行语句或数据步骤本身,都有某种内置的输出语句。

    4 回复  |  直到 8 年前
        1
  •  3
  •   Joe    8 年前

    output 在SAS中,是一条显式指令,用于将一行写入输出数据集(在 data 语句,除非在中指定单个数据集 输出 ).

    run ,除了结束步骤(意味着在 被处理,直到该数据步骤完成-相当于结束 } 在c风格编程语言模块中,基本上)包含一个隐式 return 陈述

    除非您正在使用 link goto , 回来 告诉SAS返回到数据步循环的开始。此外,return包含一个隐式 输出 语句,该语句将行输出到data语句中命名的所有数据集,除非存在 输出 语句-在这种情况下不存在。

    它是 回来 这会导致SAS在它之后停止处理东西,而不是输出。事实上,SAS在 输出 陈述它们可能不会在任何地方输出。例如:

    data x;
     do row = 1 to 100;
      output;
      row_prev+1;
     end;
    run;
    

    那个 row_prev+1 语句被执行,即使它在输出语句之后-它的存在可以在下一行看到。在您告诉它只输出三行的示例中,它仍然处理其他97行-只是没有从中输出任何内容。如果该处理产生了任何影响,则会发生-事实上 _n_ 是这些影响之一( _n_ 不是行号,而是数据步循环的迭代计数)。

    您可能应该仔细阅读数据步骤本身。SAS文档中包含了很多关于这方面的信息,或者您可以阅读以下文件 The Essence of Data Step Programming 这类事情在SGF论文中很常见,部分原因是SAS认证需要相当好地理解这一点。

        2
  •  1
  •   Stu Sztukowski    8 年前

    了解一切的最好方法是阅读 Program Data Vector (PDV)。对您的问题的简短回答:

    • 这个 output run 使用的每个SAS数据步骤的边界 set , merge , update 或(无)。

    • 这个 设置 语句获取当前行的内容并将其读入PDV(如果您有一个 设置 陈述

    • 这个 输出 语句只是将此时PDV的内容输出到输出数据集中

    • SAS仅转到源数据集中由 设置 语句到达 边界 delete 陈述 return 声明,或不符合 if 没有 then 陈述

    • point= 强制SAS直接转到由变量定义的观察编号;否则,它将逐个顺序读取每一行

        3
  •  0
  •   Snorex    8 年前

    它在最后是隐式的,除非它在该数据步骤中的一个或多个位置使用。

    每次执行遇到 OUTPUT 语句或隐式语句(如果存在),它将输出新行。

        4
  •  0
  •   Tom    8 年前

    你很接近。

    1) 有一个隐含的 OUTPUT 在数据步骤结束时, 除非 您的数据步骤包括一个显式 输出 陈述这就是为什么你的第一步写了100个观察结果,第二步只写了三个。

    2) 那个 输出 语句告诉SAS将当前记录写入输出数据集。

    3) 没有一种直接的方法可以在不使用的情况下复制记录 输出 语句,但对于一些类似的问题,可以在输入端而不是输出端造成重复。

    例如,如果你觉得你的班上没有足够的11岁儿童,你可以通过阅读两遍来复制所有11岁儿童。

    data want;
      set sashelp.class 
          sashelp.class(where=(age=11))
      ;
      by name;
    run;