SAS。在数据步骤中,输出何时覆盖默认输出?

SAS。在数据步骤中,输出何时覆盖默认输出?,sas,Sas,我对输出语句感到困惑。这里有两个程序都有输出 1)程序一。生成3个观察值,正如我所期望的,输出覆盖默认的数据步输出 data test ; infile datalines ; input type $ @ ; if type='a' then do; input money ; output ; end; datalines ; a 100 b 200 a 500 a 400 x 500 v 500 ; run; proc print; run; data test ; infile

我对
输出
语句感到困惑。这里有两个程序都有输出

1)程序一。生成3个观察值,正如我所期望的,
输出
覆盖默认的
数据步输出

data test ;
infile datalines ; 
input type $ @ ; 
if type='a' then do;
input money ; 
output ; 
end;
datalines ;
a 100
b 200
a 500
a 400
x 500
v 500
;
run;
proc print;
run;
data test ;
infile datalines ; 
input type $ @ ; 
if type='a' then input money ; 
output ; 
datalines ;
a 100
b 200
a 500
a 400
x 500
v 500
;
run;
proc print;
run;

2)节目二。产生6个观察结果。为什么
输出不覆盖此数据步骤?

data test ;
infile datalines ; 
input type $ @ ; 
if type='a' then do;
input money ; 
output ; 
end;
datalines ;
a 100
b 200
a 500
a 400
x 500
v 500
;
run;
proc print;
run;
data test ;
infile datalines ; 
input type $ @ ; 
if type='a' then input money ; 
output ; 
datalines ;
a 100
b 200
a 500
a 400
x 500
v 500
;
run;
proc print;
run;

为什么
输出
在第一种情况下执行作业,而在第二种情况下不执行作业?

在第一个程序中,输出是有条件执行的do组的一部分,因为它介于
如果type='a',则do之间
结束。因此,它仅在类型等于“a”时执行。在第二个程序中,输出根本不是do组的一部分,因此它对所有观察值执行,因此所有观察值都是输出的。

在第一个程序中,输出是有条件执行的do组的一部分,因为它介于
之间,如果type='a',则为do
结束。因此,它仅在类型等于“a”时执行。在第二个程序中,输出根本不是do组的一部分,因此它对所有观察值执行,因此所有观察值都是输出的。

+1谢谢。但按照这种逻辑,第一个程序也应该有6个观察值。原因如下:因为
输入类型$@
位于
if-then
块之前,因此无论
if-then
结果如何,都会执行。因此,在我们到达
if-then
块之前,程序已经执行了
输入类型$@
即使
if-then
块结果为false,我们也会
输入
类型
。所以所有的
类型
值都被读取,因此第一个程序应该有6个观察值,对吗?不正确。尽管读取了6条记录,但根据if条件的评估,仅输出了3条记录。如果在程序1中取出显式的
output
语句,您将看到6个观察结果,但在money字段中只有3个值。+1谢谢。但按照这种逻辑,第一个程序也应该有6个观察值。原因如下:因为
输入类型$@
位于
if-then
块之前,因此无论
if-then
结果如何,都会执行。因此,在我们到达
if-then
块之前,程序已经执行了
输入类型$@
即使
if-then
块结果为false,我们也会
输入
类型
。所以所有的
类型
值都被读取,因此第一个程序应该有6个观察值,对吗?不正确。尽管读取了6条记录,但根据if条件的评估,仅输出了3条记录。如果在程序1中取出显式的
output
语句,您将看到6个观察结果,但只有3个在money字段中有值。