If statement SAS:更新数据集(如果存在),否则创建它

If statement SAS:更新数据集(如果存在),否则创建它,if-statement,sas,exists,If Statement,Sas,Exists,我需要使用数据集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; da

我需要使用数据集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的初学者。

您试图做的实际上是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宏”可能是一个好主意。

非常感谢,它非常有效。正如你所说的,至少来自R、matlab等更简单的分析语言,使用IF控件需要一个宏似乎是违反直觉的。