我需要使用数据集dt_new更新数据集mylib.dt_old,但我想首先检查它是否确实存在,否则我会收到错误。如果它不存在,我只想创建一个数据集mylib.dt_old,它存储dt_new中包含的信息。 我尝试了以下方法:
if (exist(mylib.dt_old))
then do;
data mylib.dt_old;
update mylib.dt_old dt_new;
by date var1 var2;
run;
end;
else do;
data mylib.dt_old; set dt_new;
run;
end;
但是,当mylib.dt_old不存在时,我收到错误
ERROR: File MYLIB.DT_OLD.DATA does not exist.
并且sas继续实际执行else语句(创建dt_old复制dt_new)。
相反,如果dt_old存在,我得
if (exist(mylib.dt_old))
--
180
ERROR 180-322: Statement is not valid or it is used out of proper order.
我做错了什么? PS:我是SAS的初学者。
答案 0 :(得分:3)
您尝试做的事实上有资格成为SAS中的宏编程,有时候会被视为“高级”主题。
您正在使用的正常if-then控制逻辑是SAS认为的数据步骤代码,即它仅在数据步骤中有效。但是有一种“宏”语言看起来很相似,但是以%
前缀来区分。以下是修改后的代码的外观:
%macro updater();
%if %sysfunc(exist(mylib.dt_old))
%then %do;
data mylib.dt_old;
update mylib.dt_old dt_new;
by date var1 var2;
run;
%end;
%else %do;
data mylib.dt_old;
set dt_new;
run;
%end;
%mend updater;
%updater()
虽然这个例子很简单,但SAS宏语言经常违反直觉(至少对我来说)。如果您是初学者,最好在线查找并阅读“转入SAS宏”。