一个或多个数据步骤OUTPUT语句如何工作并且可以隐含?

时间:2017-01-30 14:41:46

标签: sas

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

我需要有条件地输出重复的观察结果。虽然我可以使用过多的输出语句,但我想如果SAS做了正常的迭代并且输出只是创建了一个额外的观察。

1)SAS中的run语句是否有内置output语句? (sum语句具有内置retain

的方式

2)当我要求SAS输出某些观察结果时会发生什么 - 特别是在set声明之后?它会将所有值设置为一个条件,然后只保留我请求的值吗?或者它与其他陈述有某种相似之处,例如point=陈述?

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

例如:

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个观察结果,test2有3个观察结果,test3有103个观察结果。这让我觉得run语句或数据步骤本身都有某种内置的输出语句。

4 个答案:

答案 0 :(得分:3)

SAS中的

class Clock extends React.Component { render() { return ( <div> <h1>Hello, world!</h1> <h2>It is {this.props.date.toLocaleTimeString()}.</h2> </div> ); } } 是向输出数据集(在output语句中命名的所有数据集写出一行的明确指令,除非您指定单个数据集在data)。

output,除了结束步骤(意味着在处理run之后没有语句直到该数据步骤完成 - 相当于c风格编程语言中的结束run模块,基本上)包含隐式return语句。

除非您使用的是}link,否则goto会告诉SAS返回数据步骤循环的开头。此外,return包含一个隐式return语句,该语句将行输出到数据语句中指定的所有数据集,除非数据步骤代码中有output语句 - 在这种情况下不存在。< / p>

output导致SAS实际上停止处理后的事情 - 而不是输出。事实上,SAS在return陈述之后愉快地做事;它们可能无法在任何地方输出。例如:

output

执行data x; do row = 1 to 100; output; row_prev+1; end; run; 语句,即使它在输出语句之后 - 可以在下一行看到它的存在。在你的例子中,你告诉它只输出三行,它仍然处理另一行97 - 只是没有从它们输出。如果从该处理中发生任何影响,则会发生 - 实际上,row_prev+1的递增是这些影响之一(_n_不是行号,而是数据步骤循环的迭代计数)

您应该阅读数据步骤本身。 SAS文档包含大量有关该文档的信息,或者您可以阅读The Essence of Data Step Programming等文章。这种事情在SGF论文中很常见,部分原因是SAS认证需要相当好地理解这一点。

答案 1 :(得分:1)

了解一切的最佳方式是阅读Program Data Vector(PDV)。简短回答你的问题:

  • output语句隐含在使用runsetmerge的每个SAS数据步骤的update边界或(没有)。

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

  • output语句只是将当时PDV的内容输出到输出数据集中

  • set语句到达run边界,delete语句,return语句时,SAS仅转到由if语句定义的源数据集中的新行,或then没有point=陈述

  • 的条件失败
  • public class Message { public int ID; Dictionary<dynamic, dynamic> dict public Message(int ID, Dictionary<dynamic, dynamic> Data) { this.ID = ID; dict = Data } } 迫使SAS直接转到变量定义的观察数;否则,它将按顺序逐行读取每一行

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你非常接近。

1)数据步骤结束时隐含OUTPUT ,除非您的数据步骤包含明确的OUTPUT语句。这就是为什么你的第一步写了所有100个观察,第二步只写了三个。

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

3)没有直接的方法可以在不使用OUTPUT语句的情况下执行您想要复制记录的内容,但是对于某些类似的问题,您可能会导致输入端而不是输出端的重复。

例如,如果您认为您的班级没有足够的十一岁孩子,您可以通过阅读两次来为所有十一岁的孩子制作两份副本。

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