我在IF-statement
程序中实现了SAS
,该程序基本上检查了一年比较的有效性。如果IF-statement
是TRUE
,则一些其他变量将被初始化和计算,如果IF-statement
是FALSE
,则什么也不会发生。
但是,我刚刚意识到无论IF-statement
是TRUE
还是FALSE
,附加变量都会被初始化(尽管{{1}中的MISSING
}大小写),并显示在FALSE
中。这是为什么?有直接的解决方法吗?我当然可以使用条件ODS
,但是总要添加它似乎很乏味。
drop-statement
编辑:我再次意识到data test;
value = 1;
if value > 2019 then a = 1;
/*
if value < 2019 then
do;
drop a;
end;
*/
run;
也将始终掉线,无论是否drop-statement
。
解决方案 ,但不知道它为什么起作用:
TRUE/FALSE
在四处寻找时,我发现了this sas-community post。我的问题似乎基本上是由data test;
%let value = 1;
%if &value. > 2019 %then %do; a = 1; %end;
run;
的差异引起的。应用%IF vs IF
即可。该帖子似乎已经过期,而不是现在可以在MACRO %IF
外使用MACRO %IF
的{{1}}帖子。
答案 0 :(得分:3)
这是编译和运行数据步骤之间的区别。在编译数据步骤时(在实际运行之前),SAS会确定它需要哪些变量。由于列a
在等式的左侧,因此将其添加到数据集中。请记住,此时,SAS尚不知道您将要放入哪些数据。您可能需要该a
列,而您可能不需要。这就是为什么您无法在运行时有条件地添加/删除列的原因。这些列需要在编译时知道。
在第二种情况下,如Tom所指出的,在编译数据步骤之前 对宏表达式进行求值。从SAS的角度来看,您的代码:
data test;
%let value = 1;
%if &value. > 2019 %then %do; a = 1; %end;
run;
只需对此进行评估:
data test;
run;
另一方面,此代码:
data test;
%let value = 2020;
%if &value. > 2019 %then %do; a = 1; %end;
run;
对此进行评估:
data test;
a = 1;
run;
答案 1 :(得分:1)
MACRO代码和SAS代码是两个不同的系统。宏处理器首先检查代码,然后解释任何宏代码(查找%和&触发器)。然后,结果文本继续显示并被评估为SAS代码。
因此,在第二种情况下,宏处理器会根据宏变量的值生成不同的SAS代码。
还请注意,您的案例正在测试不同的事物。在宏代码中,您正在测试宏变量的值。在数据步骤代码中,您正在测试数据集变量的值(用于特定观察)。