在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语句或数据步骤本身都有某种内置的输出语句。
答案 0 :(得分:3)
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
语句隐含在使用run
,set
,merge
的每个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;